美文网首页
RxSwift_02_订阅_监听_销毁

RxSwift_02_订阅_监听_销毁

作者: MR_詹 | 来源:发表于2021-03-12 11:05 被阅读0次

订阅

有了可观察序列Observable,之后还必须订阅subscribe(),才能接收到它发出的Event

RxSwift提供的订阅方法如下

常用方法一:

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)

相关文章

网友评论

      本文标题:RxSwift_02_订阅_监听_销毁

      本文链接:https://www.haomeiwen.com/subject/hijkqltx.html