getDataInBackgroundWithBlock

getDataInBackgroundWithBlock

我在了解区块究竟如何工作方面有一个小问题。

for x in self.activerestaurantIDArray
{
let namelabel = x.0
self.activenameArray.append(namelabel)

let distancelabel = x.1
self.activedistanceArray.append(distancelabel)

let imageFile = x.2
imageFile.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in

if error == nil {
let realimage = UIImage(data: imageData!)
self.activeimageArray.append(realimage!)
}

println(self.activenameArray)
println(self.activedistanceArray)
println(self.activeimageArray)

})
}


在上面的代码中,我将信息从元组(命名为:activerestaurantIDArray)追加到数组中,以便获得名称,距离和图像的单独数组。至于图像,我只能从解析中检索PFFile,因此我将不得不将文件转换为UIImage。

但是,当我这样做时,仅当println()位于块(imageFile.getDataInBackgroundWithBlock)内时,activeImageArray的追加才有效。

如果我要在盒子外面的任何地方println(self.activeimageArray),则数组将显示为nil。我不太确定为什么会这样,或者我应该如何确保附加值在Block {}之外执行。任何帮助将不胜感激。

最佳答案

闭包(也称为是,块)是可以稍后调用的代码段,它们本质上是函数。

您在imageFile.getDataInBackgroundWithBlock中所做的就是下载数据,并且在下载数据后,imageFile.getDataInBackgroundWithBlock会调用您的块,将刚刚下载的内容传递给您。

之所以这样做是因为下载必须在单独的线程中进行。否则,您的主线程将冻结,不仅会给用户带来麻烦,而且在无响应5秒钟后,操作系统将杀死您的应用程序。 getDataInBackgroundWithBlock会为下载操作生成一个不同的线程,然后通过调用块来通知您。这使您可以下载任何内容,而不会“冻结”或“挂起”您的应用程序。

因此,imageData在块外时为零,因为您要在块完成下载操作之前尝试使用它。您的代码永远不会比下载操作慢,因此您必须使用该块来实现要在操作完成下载后要使用的代码,在这种情况下,设置imageData。

编辑以添加,这并非Parse独有。几乎所有可以冻结UI的框架都将执行这些操作并使用块来实现通知。仍然可以通过使用委托来通知,但是自从在Objective-C中引入块以来,人们一直在远离这种模式。

关于arrays - Swift中解析块的基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31374840/

10-10 20:26