NSBatchUpdateRequest:。更新未在didChangeObject中触发

时间:2015-12-01 03:20:08

标签: swift core-data nsfetchedresultscontroller

我在学习Swift时正在构建博客阅读器。在此我将数据保存到Core Data,并可选择将文章标记为" read"。当我使用editActionsForRowsAtIndexPath将它们单独标记为读取时,tableview.reloadData()可以正常工作,单元格格式也会发生变化。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
</ul>

但是,当我使用NSBatchUpdateRequest时,核心数据更新但单元格格式化不会更新。我必须强制退出应用程序并重新启动以使单元格正确显示。我在didChangeObject中添加了print(&#34; Updated&#34;)来验证它是不是导致问题的configureCell。

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let object = fetchedResultsController.objectAtIndexPath(indexPath)
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext
    var edit = UITableViewRowAction()
    if let read = object.valueForKey("read") as? Bool{
        if read == true{
            edit = UITableViewRowAction(style: .Normal, title: "Mark\nUnread") { action, index in
                object.setValue(false, forKey: "read")
                do{
                    try context.save()
                }catch{

                }
                tableView.reloadData()
                self.updateReadAll()
            }
            edit.backgroundColor = UIColor(hexaString: "#A1A19E")
        }else{
            edit = UITableViewRowAction(style: .Normal, title: "Mark\nRead") { action, index in
                object.setValue(true, forKey: "read")
                do{
                    try context.save()
                }catch{

                }
                tableView.reloadData()
                self.updateReadAll()
            }
            edit.backgroundColor = UIColor(hexaString: "#A1A19E")
        }
        return [edit]
    }else{
        return []
    }
}

didChangeObject不能用于批量更新吗?我还能做些什么来更新细胞吗?

1 个答案:

答案 0 :(得分:1)

观看2014 WWDC关于批量更新的视频。基本上,更新是在磁盘上进行的,但数据的内存副本是 NOT 更新。您必须自己更新内存中的对象,重置上下文或单独刷新每个对象。