【问题标题】: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 的编译时警告。我从阅读中了解到,如果我什么都不做可能没问题:(下面提到的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()
            }
        }
    }
}

【问题讨论】:

    标签: swift rx-swift


    【解决方案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 在那个范围内是正确的,但绝对是一个很好的建议,再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2022-08-19
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多