Как я могу загрузить несколько файлов последовательно в S3 с помощью AWSTask? - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать метод, который загружает несколько изображений последовательно. Если какой-либо из них выходит из строя, он останавливает последовательность, а затем вызывает блок завершения с ошибкой. Если все они загружены успешно, я вызываю блок завершения без ошибок. Это должно быть легко, правда? Но использовать 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)

...