如何阻止主线程等到完成块结束

时间:2015-04-07 11:17:25

标签: multithreading swift

我使用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
通过做一些研究我发现主线程没有等待完成块来完成执行

请一些帮助来阻止主线程直到执行完成块

1 个答案:

答案 0 :(得分:2)

您不想阻止主线程,这对您和用户都有害。

相反,在块中,一旦您拥有图像数据并准备好MD5,您应该切换回主线程(使用dispatch_asyncperformSelectorOnMainThread...)并使用新数据更新UI 。您可以在执行此操作之前将图像数据存储在实例变量中,也可以将其作为参数传递给您调用的方法(如果使用调度方法,主线程块将捕获它)。

通过这种方式,您可以拥抱您尝试做的异步特性,并利用iOS的多线程功能,让您的用户感觉良好。