我在我的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()
}