Не удается преобразовать значение типа "URL?"к ожидаемому типу аргумента «Данные» - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать приложение для записи видео, где после записи видео я могу загрузить файл в aws S3. У меня проблемы с использованием функции uploadData () внутри моего приложения для записи видео.

Я использую библиотеку camerakit-ios (https://github.com/CameraKit/camerakit-ios) и библиотеку ios aws-ampify.

Я изменил функцию handleSave, используя ее для вызова другой функции uploadData (), на которую я ссылался отсюда (https://aws -amplify.github.io / docs / ios / storage ).

Я получаю ошибку Cannot convert value of type 'URL?' to expected argument type 'Data' в моей функции handleSave (). Я знаю, что это потому, что формат неправильный, но я действительно плохо знаком с совместным использованием библиотек iOS и AWS S3. Как мне это реализовать?

class VideoPreviewViewController: UIViewController {

    ...

    @IBAction func handleSave(_ sender: Any) {
        if let url = self.url {
            uploadData(data: self.url) //ERROR: Cannot convert value of type 'URL?' to expected argument type 'Data'
        }
    }

    func uploadData(data: Data) {

//        let data: Data = Data() // Data to be uploaded

        let expression = AWSS3TransferUtilityUploadExpression()
        expression.progressBlock = {(task, progress) in
            DispatchQueue.main.async(execute: {
                // Do something e.g. Update a progress bar.
            })
        }

        var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
        completionHandler = { (task, error) -> Void in
            DispatchQueue.main.async(execute: {
                // Do something e.g. Alert a user for transfer completion.
                // On failed uploads, `error` contains the error object.
            })
        }

        let transferUtility = AWSS3TransferUtility.default()

        transferUtility.uploadData(data,
                                   bucket: "YourBucket",
                                   key: "YourFileName",
                                   contentType: "text/plain",
                                   expression: expression,
                                   completionHandler: completionHandler).continueWith {
                                    (task) -> AnyObject! in
                                    if let error = task.error {
                                        print("Error: \(error.localizedDescription)")
                                    }

                                    if let _ = task.result {
                                        // Do something with uploadTask.
                                    }
                                    return nil;
        }
    }
}

1 Ответ

0 голосов
/ 28 мая 2019

Вы должны получить Data от URL

   if let url = self.url,
      let data = try? Data(contentsOf: url) {
         uploadData(data: data)
    }

Этот синтаксис является разумным, если URL-адрес локальный, для удаленного URL-адреса необходим асинхронный API.

...