天天看點

RxSwift文檔八(警告)警告

警告

未使用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)