如何阻止主线程等待完成块结束
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_async
或 performSelectorOnMainThread...
)并使用新数据更新您的 UI。您可以在执行此操作之前将图像数据存储在实例变量中,也可以将其作为参数传递给您调用的方法(如果您使用调度方法,主线程块将捕获它)。
通过这种方式,您可以接受您正在尝试做的事情的异步特性,并利用 ios 的多线程功能为您的用户创造美好生活。
【讨论】:
你能给我一些与此相关的例子吗?dispatch_async
的示例?您需要更具体一些,开始输入 Xcode 将提供的自动完成代码块,然后您可以使用 imageData
将您的代码添加到那里。
我使用了 dispatch_async 并将我的给定代码放入其中,它会在展开可选值时给我胎儿错误意外发现 nil
您确实遇到了一个新问题,最好单独提出。您需要显示代码并解释什么是 nil 意外。
不,我只想等到完成块被执行。在我的代码完成块中,以字节为单位提供 ImageData,但由于我的主线程不等待完成块,它将执行 var data = imageData 行,我会得到错误以上是关于如何阻止主线程等待完成块结束的主要内容,如果未能解决你的问题,请参考以下文章