2017-01-24 1 views
5

Официального AWS документы содержат следующую Objective-C кодSwift 3: Передача метод Подсобного enumerateToAssignBlocks подпись

AWSS3TransferUtility *transferUtility = [AWSS3TransferUtility defaultS3TransferUtility]; 
[transferUtility 
enumerateToAssignBlocksForUploadTask:^(AWSS3TransferUtilityUploadTask *uploadTask, __autoreleasing AWSS3TransferUtilityUploadProgressBlock *uploadProgressBlockReference, __autoreleasing AWSS3TransferUtilityUploadCompletionHandlerBlock *completionHandlerReference) { 
    NSLog(@"%lu", (unsigned long)uploadTask.taskIdentifier); 

    // Use `uploadTask.taskIdentifier` to determine what blocks to assign. 

    *uploadProgressBlockReference = // Reassign your progress feedback block. 
    *completionHandlerReference = // Reassign your completion handler. 
} 
downloadTask:^(AWSS3TransferUtilityDownloadTask *downloadTask, __autoreleasing AWSS3TransferUtilityDownloadProgressBlock *downloadProgressBlockReference, __autoreleasing AWSS3TransferUtilityDownloadCompletionHandlerBlock *completionHandlerReference) { 
    NSLog(@"%lu", (unsigned long)downloadTask.taskIdentifier); 

    // Use `downloadTask.taskIdentifier` to determine what blocks to assign. 

    *downloadProgressBlockReference = // Reassign your progress feedback block. 
    *completionHandlerReference = // Reassign your completion handler. 
}]; 

Я попытался превратить его в Swift 3 (задачу загрузить только)

transferUtility.enumerateToAssignBlocks(forUploadTask: 
     { 

      let progressPointer = AutoreleasingUnsafeMutablePointer<AWSS3TransferUtilityUploadProgressBlock?>(&uploadProgressBlock) 
      let completionPointer = AutoreleasingUnsafeMutablePointer<AWSS3TransferUtilityUploadCompletionHandlerBlock?>(&completionBlock) 

      progress = progressPointer 
      completion = completionPointer 

    } 
     , downloadTask: nil) 

Но Xcode бросает следующая ошибка

Невозможно преобразовать значение типа() ->() в ожидаемый тип аргумента [...]

Кто-нибудь получил его в Swift 3? Возможно, сигнатуры методов изменились

EDIT:

Я применил @donkon ответ:

 transferUtility.enumerateToAssignBlocks(forUploadTask: { (uploadTask:AWSS3TransferUtilityUploadTask, progress:AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityTask, Progress) -> Void)?>?, error: AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityUploadTask, Error?) -> Void)?>?) in 

         let progressPointer = AutoreleasingUnsafeMutablePointer<AWSS3TransferUtilityProgressBlock?>(&self.progressBlock) 
         let completionPointer = AutoreleasingUnsafeMutablePointer<AWSS3TransferUtilityUploadCompletionHandlerBlock?>(&self.completionHandler) 
     // 

         progress = progressPointer 

         completion = completionPointer 


    }, downloadTask: nil) 

Теперь Xcode говорит о том, как прогресс и завершение выпускают значения и не могут быть изменены.

+0

Обновленный ответ, основанный на ваших изменений – donkon

ответ

2

Метод, который вы пытаетесь использовать, имеет аргументы, которые являются функциями. Эти функции в SDK записываются в Objective-C. Поэтому вы должны использовать @convention(block), чтобы указать, что это ссылки на блоки, совместимые с Objective-C.

AWSS3TransferUtility.default().enumerateToAssignBlocks(forUploadTask: { (uploadTask:AWSS3TransferUtilityUploadTask, uploadProgressBlockReference:AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityTask, Progress) -> Void)?>?, completionHandlerReference: AutoreleasingUnsafeMutablePointer<(@convention(block) (AWSS3TransferUtilityUploadTask, Error?) -> Void)?>?) in 
    print("Hello, world") 

    uploadProgressBlockReference?.pointee = {(task:AWSS3TransferUtilityTask, progress:Progress) -> Void in 
     print("Fraction completed: \(progress.fractionCompleted)") 
    } 
}, downloadTask: nil) 
+0

Спасибо за ваш ответ, смотрите мое редактирование выше – DCDC

+0

также, почему ваш код не имеет завершения? – DCDC

+0

Я взял его отсюда: https://github.com/awslabs/aws-sdk-ios-samples/issues/28 Не могли бы вы рассказать об этом? Также вы пробовали это раньше, это достаточно, чтобы заставить его работать, даже когда приложение было убито системой? – DCDC