我有一个从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
}
答案 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
完成之前调用)。