【发布时间】:2021-02-28 15:26:35
【问题描述】:
我有以下管道设置,由于某种我无法理解的原因,第二个 flatMap 被跳过:
func letsDoThis() -> SignalProducer<(), MyError> {
let logError: (MyError) -> Void = { error in
print("Error: \(error); \((error as NSError).userInfo)")
}
return upload(uploads) // returns: SignalProducer<Signal<(), MyError>.Event, Never>
.collect() // SignalProducer<[Signal<(), MyError>.Event], Never>
.flatMap(.merge, { [uploadContext] values -> SignalProducer<[Signal<(), MyError>.Event], MyError> in
return context.saveSignal() // SignalProducer<(), NSError>
.map { values } // SignalProducer<[Signal<(), MyError>.Event], NSError>
.mapError { MyError.saveFailed(error: $0) } // SignalProducer<[Signal<(), MyError>.Event], MyError>
})
.flatMap(.merge, { values -> SignalProducer<(), MyError> in
if let error = values.first(where: { $0.error != nil })?.error {
return SignalProducer(error: error)
} else {
return SignalProducer(value: ())
}
})
.on(failed: logError)
}
查看以upload 方法开头的转换/签名。
当我说跳过时,我的意思是即使我添加断点或日志语句,它们也不会被执行。
知道如何调试或修复吗?
谢谢。
编辑:它很可能与map 和第一个flatMap 有关,但还不确定如何修复它。
看到这个link。
编辑 2:版本
- ReactiveCocoa (10.1.0):
- ReactiveObjC (3.1.1)
- ReactiveObjCBridge (6.0.0):
- ReactiveSwift (6.1.0)
编辑3:我发现问题是由于我的方法saveSignal发送sendCompleted。
extension NSManagedObjectContext {
func saveSignal() -> SignalProducer<(), NSError> {
return SignalProducer { observer, disposable in
self.perform {
do {
try self.save()
observer.sendCompleted()
}
catch {
observer.send(error: error as NSError)
}
}
}
}
发送完成是有意义的,所以我无法更改。有什么方法可以改变 flatMap 以仍然做我打算做的事情?
【问题讨论】:
-
你能更详细地解释你想要做什么吗?您是要等到所有上传完成后再保存托管对象上下文,还是要在每次上传完成时保存?如果上传失败,你还想保存吗?
-
感谢@jjoelson 的回答,我想在所有上传完成后保存,即使其中一些失败。
标签: swift flatmap reactive-swift