2017-07-10 14 views
0

iOSアプリケーションでMVVMパターンを採用しています。私はビューモデルの中でObservablesの範囲を公開プロパティとして公開し、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からエラーが発生したときに観測対象が破棄されないようにする必要があります。

関連する問題