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

Posted

技术标签:

【中文标题】如何阻止主线程等待完成块结束【英文标题】:how to block the main thread to wait until completion block is over 【发布时间】:2015-04-07 11:17:25 【问题描述】:

我使用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

通过一些研究,我发现主线程没有等待完成块完成执行

请有人帮忙阻止主线程,直到我的完成块被执行

【问题讨论】:

它不应该等待。你为什么想要它? 因为首先我在 For 循环中运行上面的代码,它会给我胎儿错误 阻塞主线程可能是最糟糕的主意。它会冻结你的用户界面 我同意@zisoft。你需要使用回调来获取你想要的数据。 你能参考一些callBack的例子吗 【参考方案1】:

你不想阻塞主线程,这对你和用户都不好。

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

通过这种方式,您可以接受您正在尝试做的事情的异步特性,并利用 ios 的多线程功能为您的用户创造美好生活。

【讨论】:

你能给我一些与此相关的例子吗? dispatch_async 的示例?您需要更具体一些,开始输入 Xcode 将提供的自动完成代码块,然后您可以使用 imageData 将您的代码添加到那里。 我使用了 dispatch_async 并将我的给定代码放入其中,它会在展开可选值时给我胎儿错误意外发现 nil 您确实遇到了一个新问题,最好单独提出。您需要显示代码并解释什么是 nil 意外。 不,我只想等到完成块被执行。在我的代码完成块中,以字节为单位提供 ImageData,但由于我的主线程不等待完成块,它将执行 var data = imageData 行,我会得到错误

以上是关于如何阻止主线程等待完成块结束的主要内容,如果未能解决你的问题,请参考以下文章

如何使“主线程”等待“子线程”执行结束后再继续执行

面试官:如何让主线程等待所有的子线程结束之后再执行?我懵了

Java主线程如何等待子线程执行结束(转)

如何实现java主线程等待子线程执行完毕之后再执行

java关于等待线程结束的问题!

MFC主线程等待另一个线程结束