在向其追加项目之前从数组中读取(崩溃)

时间:2015-10-16 09:28:47

标签: ios arrays swift asynchronous parse-platform

在类初始化下我设置:

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

如何解决这个问题并首先将项目附加到我的数组中,稍后再从中读取它们?

2 个答案:

答案 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") }