# 源碼
public static func using<Resource>(
_ resourceFactory: @escaping () throws -> Resource,
observableFactory: @escaping (Resource) throws -> RxSwift.Observable<Self.Element>)
-> RxSwift.Observable<Self.Element>
where Resource : RxSwift.Disposable
using的作用
翘地,官方注釋:
構(gòu)造一個(gè)依賴于資源對(duì)象的可觀察序列申尤,資源對(duì)象的生命周期與產(chǎn)生的可觀察序列的生命周期綁定
根據(jù)方法的結(jié)構(gòu)做簡(jiǎn)單的解釋:
(1)using操作符目的創(chuàng)建一個(gè)Observable
(2)using創(chuàng)建的Observable是通過(guò)observableFactory閉合函數(shù),而且using創(chuàng)建的Observable序列生命周期依賴于observableFactory創(chuàng)建的函數(shù)(就是同一個(gè)可觀察隊(duì)列)
(3)resourceFactory閉包函數(shù)返回的是RxSwift.Disposable類型的值衙耕,通常是在這個(gè)閉包函數(shù)中訂閱另外一個(gè)可觀察序列并將其Disposable的返回值return昧穿,這樣才能讓這個(gè)序列的生命周期依賴于observableFactory創(chuàng)建的生命周期
Demo案例
class NetworkController: UIViewController {
let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
//一個(gè)無(wú)限序列(每隔0.1秒創(chuàng)建一個(gè)序列數(shù) )
let infiniteInterval$ = Observable<Int>
.interval(.milliseconds(100), scheduler: MainScheduler.instance)
.do(
onNext: { print("infinite$: \($0)") },
onSubscribe: { print("開(kāi)始訂閱 infinite$")},
onDispose: { print("銷毀 infinite$")}
)
//一個(gè)有限序列(每隔0.5秒創(chuàng)建一個(gè)序列數(shù),共創(chuàng)建三個(gè) )
let limited$ = Observable<Int>
.interval(.milliseconds(200), scheduler: MainScheduler.instance)
.take(2)
.do(
onNext: { print("limited$: \($0)") },
onSubscribe: { print("開(kāi)始訂閱 limited$")},
onDispose: { print("銷毀 limited$")}
)
//使用using操作符創(chuàng)建序列
let o: Observable<Int> = 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()
}
}
/// 打印結(jié)果:
/// 開(kāi)始訂閱 infinite$
/// 開(kāi)始訂閱 limited$
/// infinite$: 0
/// infinite$: 1
/// limited$: 0
/// o === 0
/// infinite$: 2
/// infinite$: 3
/// limited$: 1
/// o === 1
/// 銷毀 limited$
/// 銷毀 infinite$
項(xiàng)目運(yùn)用典型的案例就是:RxSwift官方Demo中ActivityIndicator
文件的使用
提示:RxSwift的學(xué)習(xí)最好還是參考官方提供的Demo橙喘,寫法是最優(yōu)雅的