gpt4 book ai didi

swift - rxswift 错误处理问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:52 24 4
gpt4 key购买 nike

我的 View 模型中有一个名为 createObservableBehaviorSubject。我的 View Controller 订阅它。

viewModel!.createObservable.subscribe(onNext: {[unowned self] (obj:PassbookModelType?) -> Void in
if let _ = obj{
self.dismissVC()
}
}, onError: { (error) -> Void in
print(error)
}).addDisposableTo(self.dispose)

我在 View 模型中也有一个名为 saveObject() 的函数。如果我单击导航栏右侧的项目,它将被发射。并且有一个错误将发送给 createObservable 的观察者。

func saveObject(){
```````
```````
if condition {
createObservable.on(Event.Next(model))
createObservable.onCompleted()
}else{
createObservable.onError(MyError.someError)
}
}

问题是,如果错误发生,createObservable 将被关闭,所以我以后不会收到任何 Next 事件。我尝试使用 retry(),但它似乎会导致死锁, View Controller 无法再响应任何触摸事件。那么有人可以告诉我如何解决这个问题吗?非常感谢

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(...) .

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

关于swift - rxswift 错误处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33885108/

24 4 0
文章推荐: javascript - 如何在 UIwebview 中以正确的格式显示带有 ""、 等标签的字符串?
文章推荐: php - "PHP Composer"与 "Ruby Gems and Bundler"相比
文章推荐: php - Magento 覆盖运输方式
文章推荐: html - 将元素定位在
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com