RxSwift核心之序列的创建、订阅与销毁

简介: RxSwift核心之序列的创建、订阅与销毁

1. RxSwift核心

Observable:产生产生事件(Event)

Observer:负责订阅Observable,响应Observable产生的事件(Event)

Disposable管理绑定(订阅)的生命周期


2. 什么是序列?

一切事物皆是序列。比如把网络请求的返回的JSON看作是一个序列,然后当取到 JSON 时,将它打印出来;再比如把任务回调看作是一个序列。当任务结束后,提示用户任务已完成。


3. 序列的创建(Observable)

可以使用以下几种方式创建Observableobservable1中使用onNext(Event)发出元素,其他几种方式均为常用的操作符进行的创建

let observable1 = Observable<Int>.create { (observer) -> Disposable in
    observer.onNext(1)
    observer.onCompleted()
    return Disposables.create()
}
let observable2 = Observable.just(1)
let observable3 = Observable.of(1)
let observable4 = Observable.from([1])
let observable5 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)


4. 序列的订阅(Observer)

方式一:直接创建AnyObserver进行订阅,监听next(Element)元素或者error(Swift.Error)错误事件或者completed完成事件


let observer: AnyObserver<Int> = AnyObserver { (event) in
    switch event {
    case .next(let res):
        print(res)
        break
    case .completed:
        print("completed")
        break
    case .error(let err):
        print(err is TestError)
        break
    }
}
observable1.subscribe(observer)

方式二:直接调用subscribe进行订阅

observable1.subscribe { (value) in
    print(value)
} onError:
 { (err) 
in
    print(err is TestError)
} onCompleted:
 {
    print("completed")
} onDisposed: {
    print("onDisposed")
}

方式三:通过Binder绑定,把Observable的结果通过map转换绑定到某个元素上进行订阅,其中label.rx.textBinder<String?>类型



let label = UILabel()
observable1.map({ "\($0)" }).bind(to: label.rx.text)


5. 销毁(Disposable)

每当一个Observable被订阅的时候,这个函数就会返回一个Disposeable实例,通常来说,一个序列如果发出了error或者completed事件,那么所有内部资源都会被释放。如果你需要提前释放这些资源或取消订阅的话,那么你可以手动调用Disposeabledispose方法,调用dispose方法后,订阅将被取消,并且内部资源都会被释放。通常情况下,你是不需要手动调用dispose方法的,除非明确知道这个资源我不再使用,这个场景下可以手动调用,取消订阅的几种方式如下:

方式一:直接调用dispose立即释放资源

observable1.subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}.dispose()

方式二:利用DisposeBag,当bag销毁(deinit)的时候,会自动调用Disposeabledispose方法


observable1.subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}.disposed(by: disposeBag)

方式三:利用take(until: rx.deallocated),当前的实例销毁(deinit)的时候,会自动调用Disposeabledispose方法

let _ = observable1.take(until: rx.deallocated).subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}
目录
打赏
0
0
0
0
3
分享
相关文章
双卡3090消费级显卡 SFT OpenBuddy-LLaMA1-65B 最佳实践
OpenBuddy继接连开源OpenBuddy-LLaMA1-13B、OpenBuddy-LLaMA1-30B后,8月10日,一鼓作气发布了650亿参数的大型跨语言对话模型 OpenBuddy-LLaMA1-65B。
RxSwift特征序列Single、Maybe、Completable的使用
RxSwift特征序列Single、Maybe、Completable的使用
259 1
04-深入了解isa指针以及内部结构
04-深入了解isa指针以及内部结构
94 0
04-深入了解isa指针以及内部结构
05-Class的结构以及class_rw_t和class_ro_t的区别
05-Class的结构以及class_rw_t和class_ro_t的区别
114 0
RxSwift调度器 - Schedulers
RxSwift调度器 - Schedulers
117 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等