我正在尝试制作一个RSS阅读器,它有一个每30分钟左右更新一次的数据库(我目前在10秒内进行测试),当你选择一组你要查看的Feeds时,它需要它们来自数据库并将它们放入一个名为feedItems的数组中。此数组仅在viewDidLoad中进行修改,以便从数据库中复制它,并在配置单元格时查看该特定帖子是否已被删除。
override func viewDidLoad() {
super.viewDidLoad()
self.title = theTitle
let fetchRequest = NSFetchRequest(entityName: "Feed")
if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [Feed] {
for f: Feed in fetchResults{
if f.category == theUrl{
feedItems.append(f)
}
}
feedItems.sort({ self.getFeedId($0.url).toInt() > self.getFeedId($1.url).toInt() })
}
if deletedFeeds.count > 10000 {
deletedFeeds = []
}
}
单元格配置:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("FeedCell", forIndexPath: indexPath) as! UITableViewCell
let item = feedItems[indexPath.row] as Feed
// Configure the cell...
if contains(deletedFeeds, getFeedId(item.url)){
feedItems.removeAtIndex(indexPath.row)
}else{
cell.textLabel?.text = item.name
cell.detailTextLabel?.text = item.summary
}
return cell
}
问题在于,如果数据库(它是一个Core Data数据库并在单独的线程上更新)在您拥有所有帖子的tableViewController中更新,则数组feedItems中每个项目的所有对象都会更新变为nil,如果单击一个单元格或向下滚动tableview,会导致程序崩溃,因为每个单元格的url都是nil。我不知道为什么会发生这种情况,因为除了viewDidLoad之外,我没有编写任何应该从数据库更新feedItems数组的内容。如果我退出tableViewController控制器并导航回它,它会更新。如果我在更新时留在tableViewController中,为什么数组中的每个对象都变为nil?我如何修复它以便在我仍然在tableViewController中时正确更新?
答案 0 :(得分:0)
将Core Data对象复制到数组中的解决方案存在问题。你遇到的问题是象征性的。有更好的方法来解决这个问题。
您需要使用NSFetchedResultsController
。它优化了表视图中Core Data实体的性能和内存显示。您可以实现NSFetchedResultsControllerDelegate
以在数据更改时更新表格视图。
首先,创建一个新项目(Master-Detail,检查“Core Data”)并检查MasterViewController。只需按照这种模式。