2017-07-10 24 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被丟棄。