警告
未使用disposable
以下是有效的subscribe*
,bind*
和drive*
系列函数返回的Disposable。
将收到有关执行某些操作的警告:
let xs: Observable<E> ....
xs
.filter { ... }
.map { ... }
.switchLatest()
.subscribe(onNext: {
...
}, onError: {
...
})
subscribe函数返回Disposable可用于取消计算和释放资源。但是,不使用它(因此不处理它)将导致错误。
方便的终止这些调用的首选方式是使用DisposeBag,通过链式调用.disposed(by: disposeBag)或直接将disposable添加到包中。
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: {
...
})
未使用的可观察序列
将收到有关执行某些操作的警告:
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)
网友评论