我正在尝试制作一个RSS阅读器,它有一个每30分钟左右更新一次的数据库(我目前每10秒进行一次更新),当您选择要查看的一组Feed时,它将从数据库并将它们放入名为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
}


问题是这样的事实:如果您在拥有所有帖子的tableViewController中时,数据库(它是一个核心数据数据库,并且在单独的线程上进行更新)进行了更新,则数组feedItems中每个项目的所有对象都变为nil,如果您单击一个单元格或向下滚动tableview,则会导致程序崩溃,因为每个单元格的网址均为零。我不知道为什么会这样,因为除了viewDidLoad之外,我没有写任何应该从数据库更新feedItems数组的东西。如果我退出tableViewController控制器并导航回它,它会更新正常。如果数组中的每个对象在更新时都留在tableViewController中,为什么它变成零,如何修复它,以便当我仍在tableViewController中时可以正确地更新它?

最佳答案

将Core Data对象复制到数组中的解决方案存在问题。您遇到的问题是象征性的。有更好的方法可以解决此问题。

您需要使用NSFetchedResultsController。它优化了表视图中核心数据实体的显示,从而提高了性能和内存。您可以实现NSFetchedResultsControllerDelegate以在数据更改时更新表视图。

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

10-04 23:04
查看更多