【发布时间】:2017-02-19 08:00:54
【问题描述】:
我需要调用一个 API 来上传照片,这个 API 返回照片的 ID。然后,我需要获取该 ID 并将其用作另一个 API 的参数。
问题是,第二个 API 在第一个 API 有机会完成(并返回 ID)之前被调用。对此有什么办法?
我正在使用 Alamofire 4 和 Swift 3。
我的代码:
// First API - Upload file
func uploadFile(url: String, image: UIImage, callback: @escaping (JSON) -> ()) {
let imageData = UIImagePNGRepresentation(image)
let URL2 = try! URLRequest(url: url, method: .post, headers: header)
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageData!, withName: "photo", fileName: "picture.png", mimeType: "image/png")
}, with: URL2, encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON
{
response in
switch response.result {
case .success(let value):
let json = JSON(value)
callback(json)
case .failure(let error):
print(error)
}
}
case .failure(let encodingError):
print(encodingError)
}
})
}
// Second API
func Post(url: String, parameters: [String:Any], callback: @escaping (JSON) -> ()) {
Alamofire.request(url, method: .post, parameters: parameters.asParameters(), encoding: ArrayEncoding(), headers: header).responseData { (response) in
switch response.result {
case .success(let value):
callback(json)
case .failure(let error):
print(error)
}
}
}
// Calling the First API
var uploadedImage: [String:String]!
uploadFile(url: baseUrl, image: image, callback: { (json) in
DispatchQueue.main.async {
uploadedImage = ["filename": json["data"]["photo"]["filename"].stringValue, "_id": json["data"]["photo"]["_id"].stringValue]
}
})
// Calling the Second API
Post(url: baseUrl, parameters: uploadedImage) { (json) in
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
}
}
【问题讨论】:
-
一般来说,在这种情况下避免并发的方法是将调用第二个 API 放在第一个的“成功回调”中(意味着第一个必须在那时完成)。
-
@Dev-iL 你是对的。但就我而言,有时没有图片要上传,所以我需要立即跳转到第二个 API。
-
然后要么做一些
if/else跳过第一个请求,或者用一些空参数调用第一个请求,这些参数要么立即失败要么成功,然后仍然将调用放在第二个请求中回调...... -
@Dev-iL 你确定没有别的办法了吗?
-
海森堡的原理告诉我们,我们永远无法确定......我相当肯定这种方法会奏效...... :)
标签: asynchronous swift3 metadata alamofire image-uploading