我使用assetForURL()来查找图像的NSData,并使用这些数据找到NSData的md5值
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
通过做一些研究我发现主线程没有等待完成块来完成执行
请一些帮助来阻止主线程直到执行完成块
答案 0 :(得分:2)
您不想阻止主线程,这对您和用户都有害。
相反,在块中,一旦您拥有图像数据并准备好MD5,您应该切换回主线程(使用dispatch_async
或performSelectorOnMainThread...
)并使用新数据更新UI 。您可以在执行此操作之前将图像数据存储在实例变量中,也可以将其作为参数传递给您调用的方法(如果使用调度方法,主线程块将捕获它)。
通过这种方式,您可以拥抱您尝试做的异步特性,并利用iOS的多线程功能,让您的用户感觉良好。