订阅
有了可观察序列
Observable
,之后还必须订阅subscribe()
,才能接收到它发出的Event
常用方法一:
subscribe(_ observer: ObserverType)
传入一个观察者对象
/// 创建一个可观察序列
let observable = Observable<String>.of("a","b","c")
/// 创建一个观察者
let observer: AnyObserver<String> = AnyObserver { event in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
observable.subscribe(observer)
常用方法二:
subscribe(_ on: (Event<String>) -> Void)
传入一个函数类型参数:Event是枚举,关联类型是String,无返回值
let observable = Observable<String>.of("a","b","c")
observable.subscribe { (event) in
print(event.element)
}
.disposed(by: bag)
常用方法三:
subscribe(onNext: onError:onCompleted:onDisposed:)
方法中的block默认都有初始化,所以可以只写其中一部分,比如onNext:
对event事件进行分类,通过不同的block处理不同类型的event,
并且会将event携带的参数直接解包出来做参数,方便我们使用
observable.subscribe { (value) in
print(value)
} onError: { (error) in
print(error)
} onCompleted: {
print("Completed")
} onDisposed: {
print("Disposed")
}
销毁
Observable从创建到终结流程
(1)一个Observable序列被创建出来后它不会马上就开始被激活从而发出Event,而是要等到它被某个人订阅了才会激活它
(2)而Observable序列激活之后要一直等到它发出了.error 或者 .completed的event后,它才被终结
dispose()方法
(1)使用该方法可以
手动取消一个订阅行为
(2)如果我们觉得这个订阅结束了不再需要,就可以调用dispose()方法吧这个订阅给销毁掉,防止内存泄露
(3)当一个订阅行为被dispose了,那么之后observable如果再发出event,这个已经dispose的订阅就收不到消息了
var disposed: RxSwift.Disposable?
override func viewDidLoad() {
super.viewDidLoad()
/// 创建一个定时器,每秒发送一个事件
let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
self.disposed = observable.subscribe { (event) in
print(event.element)
}
/// 手动点击屏幕:取消订阅事件
let tap = UITapGestureRecognizer(target: self, action: #selector(viewDidTapAction))
self.view.addGestureRecognizer(tap)
}
@objc func viewDidTapAction() {
print(type(of: self.disposed))
self.disposed?.dispose()
}
DisposeBag
除了使用dispose()手动销毁订阅之外,通常会使用一个
DisposeBag
对象来管理多个订阅行为的销毁
let disposeBag = DisposeBag()
//第1个Observable,及其订阅
let observable1 = Observable.of("A", "B", "C")
observable1.subscribe { event in
print(event)
}.disposed(by: disposeBag)
//第2个Observable,及其订阅
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
print(event)
}.disposed(by: disposeBag)