警告
未使用disposable
以下是有效的
subscribe*
,
bind*
和
drive*
系列函數傳回的Disposable。
将收到如下有關執行某些操作的警告:
let xs: Observable<E> ....
xs
.filter { ... }
.map { ... }
.switchLatest()
.subscribe(onNext: {
...
}, onError: {
...
})
subscribe函數傳回Disposable可用于取消計算和釋放資源。但是,不使用它(由于沒有disposing)将導緻錯誤。
友善的終止這些調用的首選方式是使用DisposeBag,通過鍊式調用.disposed(by: disposeBag)或直接将disposable添加到bag中。
let xs: Observable<E> ....
let disposeBag = DisposeBag()
xs
.filter { ... }
.map { ... }
.switchLatest()
.subscribe(onNext: {
...
}, onError: {
...
})
.disposed(by: disposeBag)
當disposeBag銷毀時,其中包含的disposable也将自動清理。
在xs以以可預測的方式Completed或Error消息終止的情況下,不處理訂閱Disposable将不會洩漏任何資源。然而,即使在這種情況下,使用DisposeBag仍然是清理disposable的首選方式。它確定元素計算始終在可預測的時刻終止,并使代碼更健壯,因為即使xs的實作改變,資源也将得到妥善清理。
另一種確定訂閱和資源與某些對象的生命周期相關聯的方法是使用takeUntil運算符。
let xs: Observable<E> ....
let someObject: NSObject ...
_ = xs
.filter { ... }
.map { ... }
.switchLatest()
.takeUntil(someObject.deallocated) // <-- 注意takeUntil操作符
.subscribe(onNext: {
...
}, onError: {
...
})
如果期望忽略訂閱Disposable的行為,這是如何使編譯器不發出警告的方法。
let xs: Observable<E> ....
_ = xs // <-- note the underscore
.filter { ... }
.map { ... }
.switchLatest()
.subscribe(onNext: {
...
}, onError: {
...
})
未使用的可觀察序列(unused-observable)
将收到如下有關執行某些操作的警告:
let xs: Observable<E> ....
xs
.filter { ... }
.map { ... }
此代碼定義了一個可觀察的序列,該xs序列從序列中過濾并映射,但随後忽略結果。
由于此代碼隻定義了一個可觀察的序列,然後忽略它,它實際上并沒有做任何事情。
意圖可能是存儲定義可觀察的序列并在以後使用它…
let xs: Observable<E> ....
let ys = xs
.filter { ... }
.map { ... }
…或者根據該定義開始計算
let xs: Observable<E> ....
let disposeBag = DisposeBag()
xs
.filter { ... }
.map { ... }
.subscribe(onNext: { nextElement in // <-- 注意 `subscribe*` 方法
// 使用元素
print(nextElement)
})
.disposed(by: disposeBag)