在可观察对象中处理一次性物品的正确方法
Posted
技术标签:
【中文标题】在可观察对象中处理一次性物品的正确方法【英文标题】:Proper way to dispose of a disposable within an observable 【发布时间】:2015-12-31 15:04:11 【问题描述】:我有一个HTTPService
,它返回一个Observable<NSData>
。我的目标是将该服务组合成另一个服务ServiceA
,它会为我的用例转换数据。在ServiceA
中的 RxSwift 2.0.0-rc.0 中使用 Observable.create
就足够了。我的问题是如何正确处理订阅HTTPService
返回的一次性用品。
如果我什么都不做,我会收到 result of call is unused
: http://git.io/rxs.ud 的编译时警告。我从阅读中了解到,如果我什么都不做可能没问题:(下面提到的xs
是let xs: Observable<E> ....
如果 xs 以可预测的方式终止并显示 Completed 或 Error 消息,不处理订阅 Disposable 不会泄漏任何资源,但它仍然是首选方式,因为这样元素计算会在可预测的时刻终止。
以下是我目前的处理方式,以及我想知道我是否正确执行此操作或是否误解了某些内容。
public struct ServiceA
public static func changes() -> Observable<ChangeSet>
return Observable.create observable in
// return's Observable<NSData>
let request = HTTPService.get("https://httpbin.org/get")
let disposable = request.subscribe(
onNext: data in
// Do more work to transform this data
// into something meaningful for the application.
// For example purposes just use an empty object
observable.onNext(ChangeSet())
observable.onCompleted()
,
onError: error in
observable.onError(error)
)
// Is this the right way to deal with the
// disposable from the subscription in this situation?
return AnonymousDisposable
disposable.dispose()
【问题讨论】:
【参考方案1】:正如documentation 所说的
subscribe 函数返回一个订阅 Disposable,可用于取消计算和释放资源。 终止这些流畅调用的首选方法是使用 .addDisposableTo(disposeBag) 或以某种等效的方式。 当
disposeBag
被释放时,订阅将自动 处置。
实际上,您的示例在规则方面看起来不错,但它很糟糕;)(也可以,如果您只返回这个disposable
):
public static func changes() -> Observable<ChangeSet>
return Observable.create observable in
// return's Observable<NSData>
let request = HTTPService.get("https://httpbin.org/get")
return request.subscribe(
onNext: data in
// Do more work to transform this data
// into something meaningful for the application.
// For example purposes just use an empty object
observable.onNext(ChangeSet())
observable.onCompleted()
,
onError: error in
observable.onError(error)
)
但是当你返回 Observeble
时,我想知道,为什么你不只使用 map
运算符?
在你的例子中是这样的:
public static func changes() -> Observable<ChangeSet>
return HTTPService.get("https://httpbin.org/get")
.map(ChangeSet.init)
【讨论】:
你在回复:map
.我完全忘记了,谢谢!至于disposeBag
,因为它是一个静态函数,我不知道disposeBag
在那个范围内是正确的,但绝对是一个很好的建议,再次感谢您。以上是关于在可观察对象中处理一次性物品的正确方法的主要内容,如果未能解决你的问题,请参考以下文章