在类初始化下我设置:
var cardsCover = [PFFile]()
我有两个功能。其中一个从Parse.com数据中获取并将其附加到数组:
let cards = PFQuery(className: "cards")
cards.whereKey("category", equalTo: "Fruits")
cards.findObjectsInBackgroundWithBlock { (cards: [PFObject]?, error: NSError?) -> Void in
if error == nil {
for card in cards! {
self.cardsCover.append(card["cover"] as! PFFile)
}
} else {
print("error")
}
}
并且第二个函数从此cardsCover
数组中获取并显示项目:
self.cardsCover[self.cardIndex].getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
if imageData != nil {
let image = UIImage(data: imageData!)
let imageView = UIImageView(image: image!)
contentView.addSubview(imageView)
} else {
print(error)
}
}
但是当我启动我的应用程序时,它首先尝试显示来自空数组的图像,而不是将项目附加到数组,稍后再读取它。所以,它崩溃了。
我将断点设置到第二个函数的第一行,当我输入:
po cardsCover
返回0 elements
。
如何解决这个问题并首先将项目附加到我的数组中,稍后再从中读取它们?
答案 0 :(得分:0)
首先,在从数组中获取元素时,始终对数组大小进行安全检查以避免崩溃。
其次,您需要确保在调用数据setter函数后始终调用从cardsCover
读取数据的函数。您在数据提取器中有一个完成块,您可以在其中触发数据提取器。您还可以实施delegate
回调或在数据下载完成后发布通知,以便此后可以开始使用数据。
答案 1 :(得分:0)
我认为getDataInBackgroundWithBlock是异步API(听起来像是在主队列中运行)所以你需要调度到主队列。这是怎么做的
if self.cardsCover.count > self.cardIndex {
self.cardsCover[self.cardIndex].getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
dispatch_async(dispatch_get_main_queue()) {
if imageData != nil {
if let image = UIImage(data: imageData!){
let imageView = UIImageView(image: image!)
contentView.addSubview(imageView)
} else { print ("imageData can not be converted to image") }
} else {
print("There was no imageData")
}
}
}
} else { print("cardIndex bigger than array count") }