【问题标题】: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的例子吗

标签: multithreading swift


【解决方案1】:

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

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

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

【讨论】:

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