Мне нужно вызвать API для загрузки фотографии, этот API возвращает идентификатор фотографии. Затем мне нужно получить этот идентификатор и использовать его в качестве параметра для другого API.Как выпустить следующий запрос API только после первого?
Проблема в том, что второй API вызывается до того, как первый API имеет возможность завершить (и вернуть идентификатор). Что можно сделать по этому поводу?
Я использую 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()
}
}
Как правило, способ избежать параллелизма в таких случаях ставит вызов 2 API в «обратный вызов успеха» 1-го (это означает, что 1-й должен быть завершен к тому времени). –
@ Dev-iL Вы правы. но в моем случае иногда нет изображения для загрузки, поэтому мне нужно сразу перейти к второму API. – NST
Затем либо сделайте некоторое 'if' /' else', чтобы пропустить 1-й запрос, либо, возможно, вызовите 1-й с некоторыми нулевыми параметрами, которые либо сбой, либо прерыв сразу, а затем по-прежнему вызовут 2-й в обратном вызове .... –