swift:从" Parse"中检索图像

时间:2016-07-07 13:32:03

标签: ios swift parse-platform backend

我是Parse的新手(parse.com)。我在parse.com上有这样的表: enter image description here

我想要检索这3张图片并放入表视图行。这是我的代码:

class LeaguesTableViewController: UITableViewController {

    var leagues = [PFObject]() {
        didSet {
            tableView.reloadData()
        }
    }

    var leaguesImage = [NSData]() {
        didSet {
            tableView.reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        loadData()
        tableView.registerClass(LeaguesTableViewCell.self, forCellReuseIdentifier: "ReusableCell")   
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return leagues.count
    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 160
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("ReusableCell", forIndexPath: indexPath) as! LeaguesTableViewCell

        cell.leagueImage.image = UIImage(data: leaguesImage[indexPath.row])
        cell.leagueNameLabel.text = leagues[indexPath.row]["name"] as? String

        return cell
        }

    // MARK: Parse

    func loadData() {

        let query = PFQuery(className: "Leagues")
        query.findObjectsInBackgroundWithBlock { (objects, error) in
            if( objects != nil && error == nil) {

                // List of leagues
                for i in objects! {
                    self.leagues.append(i)

                    // Retrieve images
                    let imageFile = i["image"] as? PFFile
                    imageFile!.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
                        if error == nil {
                            if let imageData = imageData {
                                self.leaguesImage.append(imageData)

                            }
                        }
                    }
                }

            } else if error != nil {
                print("Error is: \(error)")
            }
        }
    }
}

这是我的代码,从我的观点来看,一切都还可以。但我有错误:索引超出范围。我的leaguesImages数组是空的。谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题是leaguesleaguesImages不同步。从Parse检索数组后,您立即添加leagues,但leaguesImages仅在getDataInBackgroundWithBlock完成后添加。{/ p>

我不会立即下载图像数据并将其存储在单独的数组中,而是将leagues属性添加到自定义单元格中,然后我会下载数据并应用图像。

填充数组就像填充leaguesImages数组一样,当订单重要时,这是一个坏主意,因为你不知道哪一个会先完成下载,也许第二个联盟图像是最小的,它将被设定为第一联赛的形象。 (PS:图像大小不是决定下载需要多长时间的唯一因素)