Home Articles

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

Asked
Viewed 1228 times
6

我有 HTTPService ,返回 Observable<NSData> . 我的目标是将该服务组合到另一个服务中, ServiceA 为我的用例转换该数据 . 在 ServiceA 中的RxSwift 2.0.0-rc.0中使用 Observable.create 就足够了 . 我的问题是如何正确处理从订阅 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 Answer

  • 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)
    }
    

Related