Swift 链接前可选择打开PromiseKit包装

Swift 链接前可选择打开PromiseKit包装,swift,promisekit,Swift,Promisekit,刚刚开始使用PromiseKit 6和Swift。我检查了一些示例并阅读了文档。我有一个看似琐碎的场景,但我无法回避。我有以下情况: func addModel(_ model: Model, image: UIImage?, completion: @escaping (Error?) -> Void) { var modelToSet = model var id = "" firstly { serviceWrapper.setImage(imag

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

你知道如何使用setImage方法启动链吗 有图像传递吗

您可以使用保护语句检查图像是否为零。如果为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)
   }
} 

在询问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)
    }
}
func addModel(umodel:model,image:UIImage?,完成:@escaping(Error?)->Void){
var modelToSet=模型
var id=“”
func start()->Promise{
guard let image=image else{
回报承诺()
}
返回serviceWrapper.uploadImage(image).map{path in
dishToSet.imagePath=路径
}
}
首先{
开始()
}.然后{[serviceWrapper]
serviceWrapper.setModel(modelToSet)
}.map{documentId在中
id=documentId
}.那么{
CLLocationManager.promise()
}.done{[serviceWrapper]在中的位置
setLocation(地理点(纬度:location.lat,经度:location.long),id:id)
}.catch{中的错误
完成(错误)
}
}

嘿,谢谢你的回答。你误解了我的意思,如果没有形象,我不希望整个链条都失败。如果没有图像,我想跳过第一个操作符。如果不可能,只需向前传递一个空字符串。这行得通吗?这行得通,但是如果你想处理.catch中为零的图像呢?