7

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

如果我什么都不做,我会收到编译时警告:http result of call is unused: //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()
            }
        }
    }
}
4

1 回答 1

3

正如文件所说

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,我想知道,为什么您不只使用mapoperator ?

在您的示例中,它将是这样的:

public static func changes() -> Observable<ChangeSet> {
    return HTTPService.get("https://httpbin.org/get")
                      .map(ChangeSet.init)
}
于 2016-01-08T22:47:16.923 回答