我有一个BehaviorSubject
named createObservable
在我的视图模型中。我的视图控制器订阅了它。
viewModel!.createObservable.subscribe(onNext: {[unowned self] (obj:PassbookModelType?) -> Void in
if let _ = obj{
self.dismissVC()
}
}, onError: { (error) -> Void in
print(error)
}).addDisposableTo(self.dispose)
我有一个名为saveObject()
也在视图模型中。如果我单击导航栏右侧的项目,它将被发出。并且有错误将发送到createObservable
的观察者。
func saveObject(){
```````
```````
if condition {
createObservable.on(Event.Next(model))
createObservable.onCompleted()
}else{
createObservable.onError(MyError.someError)
}
}
问题是,如果发生错误,createObservable 将被关闭,所以我不会收到任何Next
未来的事件。我尝试使用retry()
,但似乎会导致死锁,视图控制器无法再响应任何触摸事件。那么有人可以告诉我如何解决这个问题吗?多谢
viewModel!.createObservable.retry().subscribe(onNext: {[unowned self] (obj:PassbookModelType?) -> Void in
if let _ = obj{
self.dismissVC()
}
}, onError: { (error) -> Void in
print(error)
}).addDisposableTo(self.dispose)
我建议制作类型createObservable
PublishSubject<Observable<PassbookModelType>>
, 代替BehaviorSubject<PassbookModelType?>
我猜,这意外地压平了两个概念上彼此可分离的 Rx 流:saveObject
进程本身(一次性进程)并启动saveObject
由用户操作重复启动的过程。我写了一个简短的例子来演示它。
let createObservable = PublishSubject<Observable<Int>>()
override func viewDidLoad() {
super.viewDidLoad()
createObservable.flatMap {
$0.map { obj in
print("success: \(obj)")
}
.catchError { err in
print("failure: \(err)")
return empty()
}
}.subscribe()
}
// Simulates an asynchronous proccess to succeed.
@IBAction func testSuccess(sender: UIView!) {
let oneShot = PublishSubject<Int>()
createObservable.onNext(oneShot)
callbackAfter3sec { res in
oneShot.onNext(1)
oneShot.onCompleted()
}
}
// Simulates an asynchronous process to fail.
@IBAction func testFailure(sender: UIView!) {
let oneShot = PublishSubject<Int>()
createObservable.onNext(oneShot)
callbackAfter3sec { res in
oneShot.onError(NSError(domain: "Error", code: 1, userInfo: nil))
}
}
func callbackAfter3sec(completion: Int -> ()) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC * 3)), dispatch_get_main_queue()) {
completion(2)
}
}
这样做有一个重要的优点:如果一次性过程变成 Rx 风格(例如,像callbackAfter3sec() -> Observable<Int>
)以后就不需要像下面那样重新编写使用端代码了viewDidLoad
多于。唯一要做的改变就是通过一个Observable<>
反对createObservable.onNext(...)
.
抱歉我的英语水平很差。我希望这对你有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)