在可观察物内处理一次性物品的适当方法

时间:2015-12-31 15:04:12

标签: swift rx-swift

我有HTTPService,返回Observable<NSData>。我的目标是将该服务组合到另一个服务ServiceA,该服务为我的用例转换该数据。在Observable.create的RxSwift 2.0.0-rc.0中使用ServiceA,它足够直接。我的问题是如何正确处理从HTTPService订阅返回的一次性用品。

如果我什么都不做,我会在编译时警告result of call is unusedhttp://git.io/rxs.ud。我从阅读中理解,如果我什么都不做,那可能就行了:(下面提到的xslet 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 个答案:

答案 0 :(得分:2)

正如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)
}