【问题标题】:PromiseKit unwrapping optional before chainingPromiseKit 在链接之前解包可选
【发布时间】:2018-11-03 08:59:58
【问题描述】:

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

【问题讨论】:

    标签: swift promisekit


    【解决方案1】:

    只有在以下情况下我才能使用 setImage 方法启动链的任何想法 有图片通过吗?

    您可以使用 guard 语句来检查图像是否为零。如果为 nil,则执行返回所需的代码。如果没有,请使用扭曲的图像继续流程。

    func addModel(_ model: Model, image: UIImage?, completion: @escaping (Error?) -> Void) {
       var modelToSet = model
       var id = ""
    
       guard let image = image else {
           // insert code to return if needed
           return
       }
    
       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)
       }
    } 
    

    【讨论】:

    • 您好,谢谢您的回答。你误会了,我不希望没有形象的情况下整个链条都失败。如果没有图像,我想跳过第一个运算符。如果这不可能,只需传递一个空字符串。这可行吗?
    • 这确实有效,但是如果您希望能够处理 .catch 中为零的图像怎么办?
    【解决方案2】:

    在询问 PromiseKit 社区后,我得到了我需要的东西。所以这就是你可以用局部函数解决它的方法:

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

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2016-09-11
      • 2021-05-12
      • 2015-12-14
      • 2023-03-29
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多