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

问题描述:

我想做一个RSS阅读器,它有一个数据库每隔30分钟更新一次(我目前有10秒的时间进行测试),当你选择一组Feed你想看看,它将它们从数据库中取出并放入一个名为feedItems的数组中。只有在viewDidLoad中修改该数组才能将其从数据库中复制,并且在配置单元格时查看该特定的帖子是否已被删除。Swift:数据库更新后,视图控制器崩溃

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中每个项目的所有对象变为零,这会导致程序在单击单元格或向下滚动tableview时崩溃,因为每个单元格的url都是零。我不知道为什么会发生这种情况,因为我没有写任何应该从viewDidLoad以外的数据库更新feedItems数组的东西。如果我退出tableViewController控制器并导航回它,它会更新正常。为什么数组中的每个对象都会变成零,如果我在tableViewController中更新时仍留在它中,我该如何解决它,以便在我仍处于tableViewController中时正确更新?

+0

您可能在某处破坏了多线程CoreData的规则之一。你有没有读过[如何处理多线程核心数据](http://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131)? –

+0

核心数据更新后,您是否可以通知视图控制器使用表来重新加载其数据? –

将Core Data对象复制到数组中的解决方案存在问题。你遇到的问题是象征性的。有更好的方法来解决这个问题。您需要使用NSFetchedResultsController。它优化了表视图中Core Data实体的显示效果和内存。您可以实施NSFetchedResultsControllerDelegate以在数据更改时更新表格视图。

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

+0

我使用了NSFetchedResultsController,它现在可以工作,但真的有必要使用Master-Detail View Controller吗?它会对应用程序的性能或效率产生什么影响? – CG6578

+0

FRC肯定会提高性能和内存管理 - 显着! – Mundi