RxSwift_操作符_using

# 源码

public static func using(
_ resourceFactory: @escaping () throws -> Resource, 
observableFactory: @escaping (Resource) throws -> RxSwift.Observable) 
-> RxSwift.Observable 
where Resource : RxSwift.Disposable

using的作用,官方注释:
构造一个依赖于资源对象的可观察序列,资源对象的生命周期与产生的可观察序列的生命周期绑定

根据方法的结构做简单的解释:
(1)using操作符目的创建一个Observable
(2)using创建的Observable是通过observableFactory闭合函数,而且using创建的Observable序列生命周期依赖于observableFactory创建的函数(就是同一个可观察队列)
(3)resourceFactory闭包函数返回的是RxSwift.Disposable类型的值,通常是在这个闭包函数中订阅另外一个可观察序列并将其Disposable的返回值return,这样才能让这个序列的生命周期依赖于observableFactory创建的生命周期

Demo案例

class NetworkController: UIViewController {
    
    let bag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white

        //一个无限序列(每隔0.1秒创建一个序列数 )
       let infiniteInterval$ = Observable
        .interval(.milliseconds(100), scheduler: MainScheduler.instance)
           .do(
               onNext: { print("infinite$: \($0)") },
               onSubscribe: { print("开始订阅 infinite$")},
               onDispose: { print("销毁 infinite$")}
       )
        
       //一个有限序列(每隔0.5秒创建一个序列数,共创建三个 )
       let limited$ = Observable
        .interval(.milliseconds(200), scheduler: MainScheduler.instance)
           .take(2)
           .do(
               onNext: { print("limited$: \($0)") },
               onSubscribe: { print("开始订阅 limited$")},
               onDispose: { print("销毁 limited$")}
       )
        
       //使用using操作符创建序列
       let o: Observable = Observable.using({ () -> AnyDisposable in
           return AnyDisposable(infiniteInterval$.subscribe())
       }, observableFactory: { _ in return limited$ }
       )
        
        o.subscribe(onNext:{
            print("o ===",$0)
        }).disposed(by: bag)
    }
}


class AnyDisposable: Disposable {
    let _dispose: () -> Void
     
    init(_ disposable: Disposable) {
        _dispose = disposable.dispose
    }
     
    func dispose() {
        _dispose()
    }
}

/// 打印结果:
/// 开始订阅 infinite$
/// 开始订阅 limited$
/// infinite$: 0
/// infinite$: 1
/// limited$: 0
/// o === 0
/// infinite$: 2
/// infinite$: 3
/// limited$: 1
/// o === 1
/// 销毁 limited$
/// 销毁 infinite$

项目运用典型的案例就是:RxSwift官方Demo中ActivityIndicator文件的使用
提示:RxSwift的学习最好还是参考官方提供的Demo,写法是最优雅的

你可能感兴趣的:(RxSwift_操作符_using)