首页 > 解决方案 > 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 开始。或者如果没有图像,可能只返回空字符串?我在这里想念什么?

标签: swiftpromisekit

解决方案


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)
    }
}

推荐阅读