Warnings

优质
小牛编辑
135浏览
2023-12-01

未使用的 disposeable(unused-disposable)

下面对于返回 Disposablesubscribe*, bind*drive* 家族的函数是有效的。

你将会受到一个警告,因为做了一些下面的这些:

  1. let xs: Observable<E> ....
  2. xs
  3. .filter { ... }
  4. .map { ... }
  5. .switchLatest()
  6. .subscribe(onNext: {
  7. ...
  8. }, onError: {
  9. ...
  10. })

返回一个订阅 Disposablesubscribe 的函数能被用来取消计算和释放资源。然而,不使用它(并且不 dispose 它)将引起一个错误

终止这些流利调用的更好方法是通过使用 DisposeBag,或通过链式调用 .addDisposableTo(disposeBag) 或通过直接给包增加 disposable。

  1. let xs: Observable<E> ....
  2. let disposeBag = DisposeBag()
  3. xs
  4. .filter { ... }
  5. .map { ... }
  6. .switchLatest()
  7. .subscribe(onNext: {
  8. ...
  9. }, onError: {
  10. ...
  11. })
  12. .addDisposableTo(disposeBag) // <--- note `addDisposableTo`

disposeBag 被释放时,在 disposables 中的会被自动释放。

xs在无论是CompletedError消息可预见的方式终止的情况下,不处理订阅 Disposable 不会造成任何资源的泄露。 然而,即使在这种情况下,使用处置袋仍是处理订阅一次性的优选方式。它确保元素计算总是在可预测的时刻终止,使代码健壮和未来的证明,因为资源将被适当设置,即使实施xs变化。

另一种方式来确保订阅和资源都依赖于某些对象的生命周期是使用takeUntil操作符。

  1. let xs: Observable<E> ....
  2. let someObject: NSObject ...
  3. _ = xs
  4. .filter { ... }
  5. .map { ... }
  6. .switchLatest()
  7. .takeUntil(someObject.rx_deallocated) // <-- note the `takeUntil` operator
  8. .subscribe(onNext: {
  9. ...
  10. }, onError: {
  11. ...
  12. })

如果忽略订阅 Disposable 是所期望的行为,这是如何去除编译器警告。

  1. let xs: Observable<E> ....
  2. _ = xs // <-- note the underscore
  3. .filter { ... }
  4. .map { ... }
  5. .switchLatest()
  6. .subscribe(onNext: {
  7. ...
  8. }, onError: {
  9. ...
  10. })

未使用的observable(unused-observable)

你像下面这幺做就收到一个警告:

  1. let xs: Observable<E> ....
  2. xs
  3. .filter { ... }
  4. .map { ... }

此代码定义过滤并从 xs 序列映射的 observable, 但忽略结果

由于该代码只是定义了一个可观察序列(observable),然后忽略它,它实际上并没有做任何事情。

你的意图可能是要幺存储可观察序列(observable)定义并在以后使用它…

  1. let xs: Observable<E> ....
  2. let ys = xs // <--- names definition as `ys`
  3. .filter { ... }
  4. .map { ... }

… 或开始基于定义的计算

  1. let xs: Observable<E> ....
  2. let disposeBag = DisposeBag()
  3. xs
  4. .filter { ... }
  5. .map { ... }
  6. .subscribeNext { nextElement in // <-- note the `subscribe*` method
  7. // use the element
  8. print(nextElement)
  9. }
  10. .addDisposableTo(disposeBag)