在Alamofire中使用多部分表单数据上载多个图像时出错

时间:2018-01-10 14:10:09

标签: ios alamofire multipartform-data

我搜索了许多问题并应用了解决方案,但不知怎的,我的逻辑运行不正常。这是API调用中的预期结果:

enter image description here

我发送的电话是:

let parameters = [
                "address": self.addressField.text ?? "",
                "pharmacy_id": "\(pharmaID ?? 0)",
                "is_default": "\(isDefault ?? 0)",
                "cash_payment": "\(1)",
                "is_home_delivery": "\(isDelivery ?? 0)"
                ] as [String : Any]

            Alamofire.upload(multipartFormData:{ multipartFormData in

                for key in parameters.keys {
                    let name = String(key)
                    if let val = parameters[name] as? String{
                        multipartFormData.append(val.data(using: .utf8)!, withName: name)
                    }
                }
                DispatchQueue.main.async {

                for (image) in self.presImagesArray {
                    if  let imageData = UIImageJPEGRepresentation(image, 0.5) {
                        multipartFormData.append(imageData, withName: "prescription[]", fileName: "image.jpeg", mimeType: "image/jpeg")
                    }
                }

//                     for (image) in self.presImagesArray {
//                    multipartFormData.append(UIImageJPEGRepresentation(image, 0.1)!, withName: "prescription", fileName: "image.jpg", mimeType: "image/jpg")
//                    }

                }
            },
                             usingThreshold:UInt64.init(),
                             to:url,
                             method:.post,
                             headers:headers,
                             encodingCompletion: { encodingResult in
                                switch encodingResult {
                                case .success(let upload, _, _):
                                    upload.responseJSON { response in
//                                        if let result = response.result.value as? [String: AnyObject] {
//                                            print(result["message"])
//                                        }
                                        print(response)
                                        self.clearAllNotice()
                                        self.successNotice("Success")
                                    }
                                case .failure(let encodingError):
                                    print(encodingError, encodingError.localizedDescription)
                                    self.clearAllNotice()
                                    self.errorNotice(encodingError.localizedDescription)
                                }
            })
        } else {
            self.noticeInfo("Login Needed")
        }
    }

我遇到的问题是,该调用返回的消息为The prescription field is required.,这意味着prescription[]中的上传图片无法正常工作,后端人员说问题是在我的最后。

正如您从代码中看到的那样,我添加了一个for循环,在其中我转换并发送图像数据,密钥为prescription[]但仍然是我&# 39;得到这个回应。

1 个答案:

答案 0 :(得分:1)

您的问题是您正在调用DispatchQueue.main.async来创建图片。一旦离开此方法,此闭包的调用者就会继续,因此,由于您要异步添加图像,因此在添加图像之前已经发送了参数。

如果确实需要调用不同的队列,则需要使用DispatchQueue.main.sync来阻止关闭,直到调度完成。但是,您不需要这样做,并且也不建议您在主/ UI线程上执行UIImageJPEGRepresentation,因为它功能繁重并且您将被阻止用户界面。