2015-04-07 3 views
0

я использовал assetForURL(), чтобы найти NSData изображения и использовать эти данные я найти значение md5 из NSDataкак блокировать основной поток ждать до завершения блока не более

var imageData = NSData() 
self.assetsLibrary.assetForURL(url, resultBlock: { 
      (asset: ALAsset!) in 
      if asset != nil { 
       let assetRep: ALAssetRepresentation! = asset.defaultRepresentation() 
       let sizeOfRawDataInBytes: Int = Int(assetRep.size()) 
       var rawData: NSMutableData = NSMutableData(length: sizeOfRawDataInBytes)! 
       var bufferPtr: UnsafeMutablePointer<Void> = rawData.mutableBytes 
       var bufferPtr8: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>(bufferPtr) 

       var error: NSError? = nil 
       assetRep.getBytes(bufferPtr8, fromOffset: 0, length: sizeOfRawDataInBytes, error: &error) 

       imageData = NSData(bytesNoCopy: bufferPtr8, length: sizeOfRawDataInBytes, freeWhenDone: false) 

      } 
      }, failureBlock: { 
       (error: NSError!) in 

       NSLog("Error!") 
      } 


     ) 




    //want to block until completion block is finished execution 
var data = imageData // give me output zero bytes 
var hash = imageData.md5 

делая некоторые исследования я обнаружил, что основной поток не дожидаясь завершения блока, чтобы закончить выполнение

, пожалуйста, кто-нибудь помощь, чтобы блокировать основной поток, пока мой блок завершения не выполняется

+3

Не стоит ждать. Зачем вам это нужно? – Wain

+0

, потому что, прежде всего, я запускаю приведенный выше код в цикле For, и он даст мне фетальную ошибку. –

+2

. Блокирование основного потока, вероятно, является наихудшей идеей. Это заморозит ваш UI – zisoft

ответ

2

Вы не хотите, чтобы блокировать основной поток, его будет плохо для вас и пользователя.

Вместо этого в блоке, когда у вас есть данные изображения и готовый MD5, вы должны вернуться к основному потоку (используя или performSelectorOnMainThread...) и обновить свой пользовательский интерфейс новыми данными. Вы можете либо сохранить данные изображения в переменной экземпляра, прежде чем делать это, либо передать его в качестве параметра для метода, который вы вызываете (блок основного потока будет захватывать его, если вы используете диспетчерский подход).

Таким образом, вы охватываете асинхронный характер того, что вы пытаетесь сделать, и используя многопоточную возможность iOS, чтобы сделать жизнь полезной для вашего пользователя.

+0

Может ли у вас ссылка на какой-то пример, связанный с этим? –

+1

Пример 'dispatch_async'? Вам нужно быть более конкретным, начните вводить текст, который Xcode предложит для автоматического заполнения блока кода для вас, а затем вы можете добавить свой код с помощью 'imageData' туда. – Wain

+0

Я использовал dispatch_async и поместил код моего кода в то, что он даст мне ошибку плода, неожиданно обнаружен нуль, разворачивая необязательное значение. –