gpt4 book ai didi

arrays - Swift 中解析 block 的基础知识

转载 作者:行者123 更新时间:2023-11-30 14:14:19 24 4
gpt4 key购买 nike

我在理解 block 到底如何工作方面遇到了一个小问题。

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()位于 block (imageFile.getDataInBackgroundWithBlock)内时,activeImageArray的追加才有效。

如果我在框外的任何地方 println(self.activeimageArray) ,该数组将为零。我不太确定为什么会发生这种情况,或者我应该如何确保附加值在 Block{} 之外执行。任何帮助将不胜感激。

最佳答案

闭包(也称为"is"、“ block ”)是可以稍后调用的代码片段,它们本质上是函数。

您在imageFile.getDataInBackgroundWithBlock中所做的是下载数据,下载数据后,imageFile.getDataInBackgroundWithBlock将调用您的 block ,向您传递刚刚下载的内容。

这样做是因为下载必须在单独的线程中进行。否则你的主线程将卡住,不仅会给用户带来烦恼,而且在 5 秒无响应后,操作系统将终止你的应用程序。 getDataInBackgroundWithBlock 为下载操作生成一个不同的线程,然后它通过调用您的 block 让您知道。这使您可以下载任何内容,而无需“卡住”或“挂起”您的应用程序。

因此,当在 block 之外时,imageData 为零,因为您试图在 block 完成下载操作之前使用它。您的代码运行速度永远不会比下载操作慢,因此您必须使用该 block 来实现操作完成下载时要使用的代码,在本例中是设置 imageData。

编辑添加,这不是Parse独有的。几乎所有可以卡住 UI 的框架都会执行这些操作并使用 block 实现通知。仍然可以通过使用委托(delegate)来获得通知,但自从 Objective-C 中引入 block 以来,人们已经放弃了这种模式。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com