2017-01-24 25 views
5

oficjalne AWS docs zawiera następujący kod Objective-CSwift 3: transfer podpis metoda enumerateToAssignBlocks użytkowe

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. 
}]; 

Próbowałem przekształcenie go w Swift 3 (zadanie przesyłania tylko)

transferUtility.enumerateToAssignBlocks(forUploadTask: 
     { 

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

      progress = progressPointer 
      completion = completionPointer 

    } 
     , downloadTask: nil) 

Ale Xcode rzuca następujący błąd:

Nie można skonwertować wartości typu() ->() na oczekiwany typ argumentu [...]

Ktoś zrobił to w Swift 3? Prawdopodobnie podpisy metoda zmieniły

EDIT:

Zgłosiłem odpowiedź @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 teraz mówi, że zarówno postęp i zakończenie są pozwolić wartości i nie mogą być zmieniane.

+0

Updated odpowiedź na podstawie wprowadzonych zmian – donkon

Odpowiedz

2

Metoda, której próbujesz użyć, zawiera argumenty, które są funkcjami. Te funkcje w SDK zapisywane są w Objective-C. Dlatego powinieneś użyć @convention(block), aby wskazać, że są one odniesieniami do bloków zgodnych z 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

Dzięki za odpowiedź, proszę zobaczyć moje edycji nad – DCDC

+0

także, dlaczego Twój kod nie posiada zakończenie? – DCDC

+0

Zabrałem go stąd: https://github.com/awslabs/aws-sdk-ios-samples/issues/28 Czy mógłbyś się z nim skontaktować? Czy próbowałeś tego wcześniej, czy jest to wystarczające, aby działało, nawet gdy aplikacja została zabita przez system? – DCDC