核心数据 NSManagedObject 更改
Posted
技术标签:
【中文标题】核心数据 NSManagedObject 更改【英文标题】:Core Data NSManagedObject Changes 【发布时间】:2013-10-29 14:21:52 【问题描述】:我正在使用一个简单的 Master Detail 场景,其中 master 使用获取的结果控制器来填充其 tableview。选择行时,相应的NSManagedObject将传递给详细视图控制器,其中用于填充几个UILabels。我添加了一个 EditorViewController 以允许用户更新某些字段。保存时,我关闭 EditorViewController 并返回到 Detail 视图控制器。保存使用分配给 NSManagedObject 的上下文。
了解相关对象已更改以便我可以在 Detail VC 中更新 UI 的最佳方法是什么?目前,如果我尝试更新 Detail VC 中的 UILabel,我看不到对象属性的任何新值。我知道委托/协议方案可能会起作用,但我很好奇是否已经存在可以使用的东西——我可以寻找更新对象的通知,或者我是否应该在详细信息屏幕上有一个获取的结果控制器?不确定在这里采取的正确路径。
【问题讨论】:
【参考方案1】:NSFetchedResultsController
是解决此问题的最常见方法。它监听上下文的变化并相应地更新表格视图的内容。你的问题比较笼统,所以我会leave a link to a very good article showing how to use it properly。
【讨论】:
我进行了更多调查,看起来返回的数据已更新且准确。我的 UI 没有在 ViewWillAppear 中更新。我会将此作为一个新问题进行调查。您链接到的页面确认我正确设置了应用程序的 CoreData 部分。谢谢。【参考方案2】:您可以使用NSFetchedResultsController
并为该对象注册获取请求(我认为这是一个很好的解决方案)。或者,您可以收听NSManagedObjectContextDidSaveNotification
之类的通知,但我不建议这样做。
或者你可以将一个对象传递给你的 EditorViewController 并直接在那里更新属性。
【讨论】:
【参考方案3】:如果没有看到任何代码,很难说你要做什么,但是使用 CoreData 的另一种常见模式是利用模型-视图-控制器(MVC)范式将数据存储中的信息暂存到类变量中,然后您的接口从该类变量中使用。您担心在 CoreData 和您的类变量之间保存、更新和刷新数据,与使用该数据的接口分开。
典型的工作流程是:
//User does something that creates new info
//Store that info permanently in CoreData
//Refresh the class Variable by loading from CoreData (you can also skip this by updating the class variable simultaneously while saving to CoreData, but this is really sloppy and problematic. Better to save then re-fetch)
//Update your interface from the class Variable
或者,您可以try Key Value Observing?,但我不确定它是否适合您的情况。
【讨论】:
以上是关于核心数据 NSManagedObject 更改的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 NSInvalidArgumentException 错误
核心数据-后台线程中的更新实体会自动更改主线程中的 NSManagedObject 而无需合并-为啥?