在ViewWillAppear完成运行

时间:2016-01-24 07:25:01

标签: ios xcode swift uitableview parse-platform

我有一个从Parse数据库中提取信息的应用程序,并将其显示在UITableView中。我从viewWillAppear函数中解析信息,然后在tableView(cellForRowAtIndexPath)函数中显示它。有时我会收到一个错误,因为存储Parse信息的数组的长度为0,我尝试访问数组范围之外的索引处的信息。我相信这是因为在viewWillAppear完成运行之前调用了cellForRowAtIndexPath。这是可能的还是我的错误肯定来自其他地方?

编辑:每次都不会发生错误,我找不到重现它的方法

override func viewWillAppear(animated: Bool) {

    //begin ignoring events until the information is finished being pulled
    UIApplication.sharedApplication().beginIgnoringInteractionEvents()

    resultsArray.removeAll(keepCapacity: false)

    //run query
    let query = PFQuery(className: "Answers")
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

        if let objects = objects {

                    //append information to the resultsArray 
                }
            }
            self.tableView.reloadData()
        }
    }
    //information is now pulled, so allow interaction 
   UIApplication.sharedApplication().endIgnoringInteractionEvents()

}


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

    // THIS IS WHERE THE ERROR OCCURS
    resultsArray[indexPath.row].imageFile.getDataInBackgroundWithBlock { (data, error) -> Void in

        //set image within cell
    }
    return cell
}

3 个答案:

答案 0 :(得分:1)

我建议您将数据从Parse加载到临时数组中,然后在调用reloadData之前将其分配给属性数组 - 这样可以避免任何潜在的竞争条件,并且无需使用{{ 1}}这可能是你问题的重要部分;

removeAll

答案 1 :(得分:0)

viewWillAppear中看起来你有一个后台块findObjectsInBackgroundWithBlock,它在一个不同的线程中有一些工作要做(主线程的AKA),这意味着当块将获得时,viewWillAppear将完成回调。

这解释了为什么在cellForRowAtIndexPath完成后调用viewWillAppear,因为回调块。

这意味着一切都很好,viewWillAppear实际上完成了合法的运行"。

您实际上可以在回调方法(viewWillAppear)和cellForRowAtIndexPath内的断点中设置一个断点,并查看在调用cellForRowAtIndexPath时何时发生回调。

如果你需要一种与Parse不同的方法,你应该查看他们的documentation

答案 2 :(得分:0)

实际上,如果你的回调无法访问self.tableView,那么一切都会像往常一样继续。你可以尝试一下。

当我在init结束之前调用的viewDidLoad方法init方法访问屏幕上的视图时发生了这种情况。

无论如何,你应该知道这个事实。并且您可以访问需要tableView的回调中的viewWillAppear(在cellForRowAtIndexPath完成之前调用)。