Swift:数据库更新后视图控制器崩溃

Swift: View Controller crashes after database updates

我正在尝试制作一个 RSS reader,它有一个数据库,每 30 分钟左右更新一次(我目前有 10 秒用于测试),当你 select 一组您想要查看的提要,它从数据库中取出它们并将它们放入一个名为 feedItems 的数组中。此数组仅在 viewDidLoad 中被修改以从数据库中复制它,并且当单元配置为查看特定 post 是否已被删除时。

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([=11=].url).toInt() > self.getFeedId(.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
}

问题在于,如果数据库(它是一个核心数据数据库并在单独的线程上更新)在您位于包含所有 post 的 tableViewController 中更新时,所有对象对于数组中的每个项目,feedItems 变为 nil,如果您单击单元格或向下滚动 tableview,这将导致程序崩溃,因为每个单元格的 url 为 nil。我不知道为什么会发生这种情况,因为除了 viewDidLoad 之外,我没有编写任何应该从数据库更新 feedItems 数组的内容。如果我退出 tableViewController 控制器并导航回它,它会正常更新。如果我在 tableViewController 更新时留在 tableViewController 中,为什么数组中的每个对象都变成 nil 以及如何修复它以便在我仍在 tableViewController 中时正确更新?

将核心数据对象复制到数组中的解决方案有问题。您 运行 遇到的问题具有象征意义。有更好的方法来解决这个问题。

您需要使用 NSFetchedResultsController。它针对性能和内存优化了 table 视图中核心数据实体的显示。您可以实施 NSFetchedResultsControllerDelegate 以在数据更改时更新 table 视图。

首先,创建一个新项目(Master-Detail,检查 "Core Data")并检查 MasterViewController。只要遵循这个模式。