2017-07-10 56 views
0

我在我的iOS应用程序中采用了MVVM模式。我在我的视图模型中公开了一系列Obserbles作为公共属性,并将UI绑定到这些属性。这些观察对象是从一个可连接的可观察对象创建的。RxSwift:连接到可连接的可观察多路时间

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

如何在不需要每次重新创建视图模型的情况下实现这一目标?我知道我可以通过使用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溶液

这将每一个事件的执行主体推时间执行网络请求。 (execute.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() 
    } 

回答

1

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

当您从API接收到错误时,需要防止observable被丢弃。