swift - PromiseKit 在链接之前解包可选
问题描述
刚开始使用 PromiseKit 6 和 Swift。我检查了一些示例并阅读了文档。我有一个看起来微不足道的场景,但我无法绕过它。我有以下情况:
func addModel(_ model: Model, image: UIImage?, completion: @escaping (Error?) -> Void) {
var modelToSet = model
var id = ""
firstly {
serviceWrapper.setImage(image!)
}.map { path in
modelToSet.imagePath = path
}.then { [serviceWrapper]
serviceWrapper.setModel(modelToSet)
}.map { documentId in
id = documentId
}.then {
CLLocationManager.promise()
}.done { [serviceWrapper] location in
serviceWrapper.setLocation(GeoPoint(latitude: location.lat, longitude: location.long), id: id)
}.catch { error in
completion(error)
}
}
如您所见,在此伪代码中,我强制展开图像。任何想法只有在传递图像的情况下才能使用 setImage 方法启动链?否则直接从 setModel 开始。或者如果没有图像,可能只返回空字符串?我在这里想念什么?
解决方案
After asking the PromiseKit community, I got what I needed. So this is how you can go with solving it with a local function:
func addModel(_ model: Model, image: UIImage?, completion: @escaping (Error?) -> Void) {
var modelToSet = model
var id = ""
func start() -> Promise<Void> {
guard let image = image else {
return Promise()
}
return serviceWrapper.uploadImage(image).map { path in
dishToSet.imagePath = path
}
}
firstly {
start()
}.then { [serviceWrapper]
serviceWrapper.setModel(modelToSet)
}.map { documentId in
id = documentId
}.then {
CLLocationManager.promise()
}.done { [serviceWrapper] location in
serviceWrapper.setLocation(GeoPoint(latitude: location.lat, longitude: location.long), id: id)
}.catch { error in
completion(error)
}
}
推荐阅读
- c# - 无法使用 c# 批准对 WSUS 中的组的更新
- python - 如何为每个班级和小组生成单独的小提琴图
- flutter - Flutter Camera 录制的视频与浏览器不兼容 - 如何转换为 .mp4?
- docker - docker-compose 服务多个私有注册表
- flutter - 参数不匹配的闭包调用:函数'_MyAppState.build。
' - r - 在组内发现 +1 值
- apache-kafka - Kafka - 了解所有消费者何时执行寻求最新
- c - netstat 和 program 中的不同端口
- javascript - 如何解决“找不到此相关模块:”问题?(Vue)
- reactjs - 多次调用使用效果