一、RxSwift中心
1、observable可调查序列
创立一个工程RxSwift01 装备对应的podfile文件:
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'RxSwift01' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
pod 'RxSwift'
pod 'RxCocoa'
# Pods for RxSwift01
end
//在终端履行
pod install
中心问题
:
什么是observable可调查序列呢?
当可调查序列(Observable)发送数据项或数据项序列时调查者得到触发。这种形式促进了并发操作,因为调查者等候发送数据项的过程中无需阻塞,而是为调查者创立一个岗兵,在可调查序列发送数据项时主动触发相应的行为。
observable可调查序列又分:有限序列和无限序列
。
咱们通过代码来剖析:
//无限的
let ob = Observable<Int>.timer(.seconds(1), period: .seconds(2), scheduler: MainScheduler.instance)
ob.subscribe {num in
print(num)
} onCompleted:{
print("done")
}
.disposed(by: disposeBag)
//有限的
let ob1 = Observable.from([1,2,4,3]) //Observable.of(1,2,3,4) 都能到达意图
ob1.subscribe { num in
print(num)
} onCompleted: {
print("dnoe")
}.disposed(by: disposeBag)
运转有限序列:
Observable创立:\
-
empty
:创立一个空的序列-可是只能订阅到comlete -
just
:构建一个只需一个元素的Observable行列 – 订阅完信息主动complete -
of
:创立一个固定数量元素的Observable序列 -
from
:从一个序列(如Array/Dictionary/Set)中创立一个Observable序列。 -
deferred
:为每个订阅者创立一个新的Observable序列 -
generate
:创立一个Observable序列,只需供给的条件值为true就可以生成值。 -
error
:创立一个不会发送任何条目并且当即停止过错的Observable序列 -
range
:创立一个Observable序列,它会宣布一个系列连续的整数,然后停止 -
timer
:获取计时器Observable序列 -
interval
:底层便是封装timer
所以RxSwift也有三部曲:创立,订阅,注销。
//1.创立序列
let ob = Observable<Any>.create { observable in
// 3.发送信号
observable.onNext("班长")
observable.onError(NSError.init(domain: "myError", code: 10080, userInfo: nil))
return Disposables.create()
}
//2.订阅信号
ob.subscribe { text in
print("订阅到了:\(text)")
} onError: { error in
print("error:\(error)")
} onCompleted: {
print("完成")
} onDisposed: {
print("毁掉")
}
运转成果: 那么为什么 observable.onNext(“班长”) 会响应到订阅中?
其实咱们在第三步发送信号的时候,发送了3种信号,onNext,onError,Disposables
被Observable 别离接收了。
2、中心三部曲剖析
-
Observable<Any>.create
其实是实现了AnonymousObservable
匿名序列闭包->承继Producer->承继Observable->实现ObservableType 协议 -
订阅序列:
subscribe
->创立一个AnonymousObservable
订阅者->保存eventHandler->self.asObservable().subscribe(observer)->producer.subscribe->AnonymousObservableSink.run->parent.subscrbeHandler(AnyObserver(self)) -
发送信号:
onNext
->AnonymousObservable.onNext->ObserverBase.on[.next->.onCore .err\completed]->AnonymousObservable.onCore->self.eventHandler(event)
AnonymousObservableSink 中心代码:
final private class AnonymousObservableSink<Observer: ObserverType>: Sink<Observer>, ObserverType {
typealias Element = Observer.Element
typealias Parent = AnonymousObservable<Element>
// state
private let isStopped = AtomicInt(0)
//-------------省掉--------------
func on(_ event: Event<Element>) {
#if DEBUG
self.synchronizationTracker.register(synchronizationErrorMessage: .default)
defer { self.synchronizationTracker.unregister() }
#endif
switch event {
case .next:
if load(self.isStopped) == 1 {
return
}
self.forwardOn(event)
case .error, .completed:
if fetchOr(self.isStopped, 1) == 0 {
self.forwardOn(event)
self.dispose()
}
}
}
func run(_ parent: Parent) -> Disposable {
parent.subscribeHandler(AnyObserver(self))
}
}
中心流程图:
3、序列承继链
先看一个小比如:
/**
* 当用户输入用户名时,如果用户名缺乏 5 个字就给出赤色提示语,并且无法输入暗码,当用户名符合要求时才可以输入暗码。
* 相同的,当用户输入的暗码缺乏 6 个字时也给出赤色提示语。当用户名和暗码有一个不符合要求时底部的登录按钮不可点击,只需当用户名和暗码一起有用时按钮才可点击。
* 当点击登录按钮后弹出一个提示框,这个提示框仅仅用来做演示而已。
*/
let usernameValid = usernameTextFiled.rx.text.orEmpty
.map { text in
return text.count >= minUsernameLength
}
// Binder
usernameValid.bind(to: usernameValidLabel.rx.isHidden)
.disposed(by: disposeBag)
usernameValid.bind(to: passwordTextFiled.rx.isEnabled)
.disposed(by: disposeBag)
let passwordValid = passwordTextFiled.rx.text.orEmpty
.map { text in
return text.count >= minPasswordLength
}
passwordValid.bind(to: passwordValidLabel.rx.isHidden)
.disposed(by: disposeBag)
Observable.combineLatest(usernameValid, passwordValid) { $0 && $1 }
.bind(to: loginBtn.rx.isEnabled)
.disposed(by: disposeBag)
loginBtn.rx.tap.subscribe { _ in
print("登录")
}.disposed(by: disposeBag)
运转效果: AnonymousObservable->producer(生产者)->Observable->遵循ObservableType协议 (不想贴过多的代码,能了解多少写多少)
总结
-
创立序列
:一起创立匿名的AnonymousObservable(承继了Producer)
实例_able,并保存闭包 -
订阅序列
:Producer.subscribe创立一个_ob闭包,一起创立了AnonymousObserver(订阅者)
实例_ob,并保存闭包 - 创立一个
AnonymousObservableSink
实例sink,存储了_ob - sink履行run办法,调用了_able闭包, 一起创立一个AnyObserver实例anyOb-保存了sink的on办法
- 当_able闭包中
发送信号.next .error .completed等
,等于anyOb调用了on,最终回到_ob的onCore办法
- 履行
AnonymousObserver.onCore
办法,便是履行_ob闭包,根据事件类型回调
咱们的订阅闭包