加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 在一个可观察物内处理一次性物品的正确方法

发布时间:2020-12-14 05:00:41 所属栏目:百科 来源:网络整理
导读:我有一个HTTPService,它返回一个Observable NSData.我的目标是将该服务组合到另一个服务中,ServiceA为我的用例转换该数据.在ServiceA中使用Rx Swift 2.0.0-rc.0中的Observable.create就足够了.我的问题是如何正确处理从HTTPService订阅返回的一次性. 如果我
我有一个HTTPService,它返回一个Observable< NSData>.我的目标是将该服务组合到另一个服务中,ServiceA为我的用例转换该数据.在ServiceA中使用Rx Swift 2.0.0-rc.0中的Observable.create就足够了.我的问题是如何正确处理从HTTPService订阅返回的一次性.

如果我什么都不做,我得到编译时间警告,调用结果未使用:http://git.io/rxs.ud.我从阅读中理解,如果我什么也不做,那可能没问题:(下面提到的xs是让xs:Observable< E&gt ;. ...

In case xs terminates in a predictable way with Completed or Error message,not handling subscription Disposable won’t leak any resources,but it’s still preferred way because in that way element computation is terminated at predictable moment.

所以这就是我目前正在解决的问题,也是我想知道我是否正确地做到这一点,或者我是否误解了一些问题.

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

解决方法

正如 documentation所说

subscribe function returns a subscription Disposable that can be used to cancel computation and free resources.
Preferred way of terminating these fluent calls is by using
.addDisposableTo(disposeBag) or in some equivalent way.
When disposeBag gets deallocated,subscription will be automatically
disposed.

实际上你的例子在规则方面看起来很好,但它很糟糕;)(也可以,如果你只是返回这个一次性):

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时,我想知道,为什么你不只是使用地图运算符?

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

public static func changes() -> Observable<ChangeSet> {
    return HTTPService.get("https://httpbin.org/get")
                      .map(ChangeSet.init)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读