rxswift错误句柄问题

rxswift错误句柄问题,swift,rx-swift,Swift,Rx Swift,我的视图模型中有一个名为createObservable的BehaviorSubject。我的视图控制器订阅它 viewModel!.createObservable.subscribe(onNext: {[unowned self] (obj:PassbookModelType?) -> Void in if let _ = obj{ self.dismissVC() } }, onError: { (error) -> Void in pr

我的视图模型中有一个名为
createObservable
BehaviorSubject
。我的视图控制器订阅它

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
的类型改为
BehaviorSubject
,我猜这会意外地使两个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)
    }
}
let createObservable=PublishSubject()
重写func viewDidLoad(){
super.viewDidLoad()
createObservable.flatMap{
$0.5地图{obj英寸
打印(“成功:\(obj)”)
}
.catchError{err in
打印(“失败:\(错误)”)
返回空()
}
}.subscribe()
}
//模拟异步进程以获得成功。
@iAction func testSuccess(发件人:UIView!){
让oneShot=PublishSubject()
createObservable.onNext(oneShot)
3秒后回拨{res in
oneShot.onNext(1)
oneShot.onCompleted()
}
}
//模拟异步进程失败。
@iAction func testFailure(发送方:UIView!){
让oneShot=PublishSubject()
createObservable.onNext(oneShot)
3秒后回拨{res in
oneShot.onError(NSError(域:“Error”,代码:1,用户信息:nil))
}
}
func callbackAfter3sec(完成:Int->()){
调度后(调度时间(现在调度时间,Int64(NSEC秒*3)),调度获取主队列(){
完成(2)
}
}
这样做有一个重要的优点:如果一次性流程将来变成Rx风格(例如,像
callbackAfter3sec()->Observable
),则无需像上面的
viewdiload
那样重新编写使用端代码。只需将
Observable
对象传递给
createObservable.onNext(…)

对不起,我的英语水平很差。我希望这对你有意义