RxSwift:多次连接到 Connectable Observable

Posted

技术标签:

【中文标题】RxSwift:多次连接到 Connectable Observable【英文标题】:RxSwift: Connect to Connectable Observable multipe times 【发布时间】:2017-07-10 13:31:33 【问题描述】:

我在我的 ios 应用程序中采用了 MVVM 模式。我在我的视图模型中将一系列 Observables 公开为公共属性,并将 UI 绑定到这些属性。这些 Observable 是从私有可连接的 observable 创建的。

然后视图控制器类调用“执行”方法来触发网络请求。但是,如果由于任何原因失败,我希望能够再次调用“执行”,但这不起作用。我相信这是由于可连接的 observable 已经完成。

如何在不必每次都重新创建视图模型的情况下实现这一点?我知道我可以通过使用 flatMap 将简单的执行发布主题转换为 userDetailsObservable 来做到这一点,但我依赖 onCompleted 事件来实现其他功能。由于发布主题保持活动状态,onCompleted 事件将丢失。

可连接的可观察解决方案

class ViewModel 
    public var userName: Observable<String> 
         self.userDetailsObservable.map 
             return $0["username"]
         
    

    public var address: Observable<String> 
         self.userDetailsObservable.map 
             return $0["address"]
         
    

    public func execute() 
        self.userDetailsObservable.connect()
    

    private lazy var userDetailsObservable: ConnectableObservable<JSON> 
        return Observable.create  observer in
            // execute network request
            // assume there is a json object and error object returned
            if error != nil 
                observer.onError(error)
             else 
                observer.onNext(json)
            
            observer.onCompleted()
        .publish()
    

FlatMap 解决方案

这将在每次向执行主题推送事件时执行网络请求。 (执行.onNext())。这里的问题是 onCompleted 事件在我们转换发布主题时丢失了。

class ViewModel 
    public var userName: Observable<String> 
         self.userDetailsObservable.map 
             return $0["username"]
         
    

    public var address: Observable<String> 
         self.userDetailsObservable.map 
             return $0["address"]
         
    

    public var execute: PublishSubject<Void>()

    private lazy var userDetailsObservable: Observable<JSON> 
        return self.execute.flatMapLatest  _ in
            Observable.create  observer in
                // execute network request
                // assume there is a json object and error object returned
                if error != nil 
                    observer.onError(error)
                 else 
                    observer.onNext(json)
                
                observer.onCompleted()
            
        .share()
   

【问题讨论】:

我认为你可以尝试使用 refcount 而不是 connect 【参考方案1】:

您应该使用catchError 并返回一个默认值(例如"")。

当您从 API 收到错误时,需要防止 observable 被释放。

【讨论】:

以上是关于RxSwift:多次连接到 Connectable Observable的主要内容,如果未能解决你的问题,请参考以下文章

SQL 内连接到同一个表,在多个列上,多次

当设备连接到网络时,AWS AppSync 离线突变会多次更新到服务器

RxSwift:将 PublishSubject 绑定到多个按钮并接收发送者

RxSwift 与 BehaviorRelay<Any?> 的双向绑定

VMware Workstation 无法连接到虚拟机

如何正确安装“RxSwift”模块?