Я пытаюсь создать метод, который загружает несколько изображений последовательно. Если какой-либо из них выходит из строя, он останавливает последовательность, а затем вызывает блок завершения с ошибкой. Если все они загружены успешно, я вызываю блок завершения без ошибок. Это должно быть легко, правда? Но использовать AWSTask непросто из-за отсутствия документации и поддержки. В любом случае, читая этот документ:
Мне удалось реализовать этот метод:
func uploaImages(images: [Image], completion: @escaping (UploadImagesError?) -> Void) {
guard let userIdentityId = AWSMobileClient.default().identityId else {
completion(.noIdentityError)
return
}
// upload all the pictures in serial
var task = AWSTask<AnyObject>(result: nil)
for image in images {
task = task.continueWith { uploadTask -> AnyObject? in
// if there is an error, stop the chain
if let error = uploadTask.error {
print("--error uploading one picture: \(error)")
DispatchQueue.main.async {
completion(.serverError)
}
return nil
}
// next task
print("--uploading a picture")
let key = "protected/\(userIdentityId)/\(image.uuid)-large.jpg"
return AWSS3TransferUtility.default().uploadData(image.data, key: key, contentType: "image/jpeg", expression: nil)
}
}
// check the last task
task.continueWith { uploadTask -> AnyObject? in
DispatchQueue.main.async {
if let error = uploadTask.error {
print("----there was an error uploading all pictures: \(error.localizedDescription)")
completion(.serverError)
} else {
print("--all success")
completion(nil)
}
}
return nil
}
}
Но у меня есть некоторые проблемы. Кажется, что continueWith и continueOnSuccessWith вызываются все время, даже если загрузка не удалась (легко смоделировать, когда я использую неправильную корзину, я вижу, как в этом случае возвращается 403). Кажется, что задача помечается как успешная, когда достигает S3, не имеет значения, загружен файл или нет.
Я бы сказал, что это неправильно, потому что я не могу составлять задачи таким образом, как Bolts / AWSTask продвигают . Может быть, мне чего-то не хватает.
Так что, возможно, мне нужно использовать блок завершения в методе загрузки, но если я это сделаю, я действительно не знаю, как создать свой лог c . Я не понимаю, как использовать continueWith и другие, когда использую блок завершения.
Я задал этот вопрос AWS, но они не очень полезны: https://github.com/aws-amplify/aws-sdk-ios/issues/2827
Может ли кто-нибудь мне объяснить, как создать функцию, которую я хочу создать, с помощью AWSTaks? (Думаю, я могу сделать это с помощью NSOperation и GCD, но сейчас я предпочитаю использовать AWSTask)