使用 Core Data 在视图中引用模型对象的最佳实践是啥?

Posted

技术标签:

【中文标题】使用 Core Data 在视图中引用模型对象的最佳实践是啥?【英文标题】:What is the best practice to reference model objects in views with Core Data?使用 Core Data 在视图中引用模型对象的最佳实践是什么? 【发布时间】:2011-07-26 00:11:13 【问题描述】:

我有一个描述动物的 NSManagedObject,它具有“名称”、“物种”、“科学名称”等属性。我在 UITableView 中显示所有动物,并使用 NSFetchedResultsController 管理 NSManagedObjects。

为了向表格视图单元格提供渲染内容所需的信息,到目前为止,我只是将它们弱引用到描述动物的 NSManagedObject 中。但是,有时 NSManagedObject 会出错,当重绘表格视图单元格时,它们会重新访问对象的属性,从而防止出错。

在使用核心数据作为数据源时,为视图对象提供信息的最佳做法是什么?如果可能的话,我想避免将 NSManagedObject 的所有属性复制到表格视图单元格中。

【问题讨论】:

我在 NSManagedObject 上使用带有 KVO 的 NSFetchedResultsController,但没有绑定(它在 ios 上,如 iPhone 标签所示) 老实说,使用 NSFetchedResultsController 是你最好的选择。限制批量大小将有助于提高程序的效率,但我个人想不出更好的解决方案 【参考方案1】:

我认为明确区分模型、视图和控制器层是一种很好的做法。特别是确保视图不保持模型状态。持有 NSManagedObject 持有 Model 对象。复制一些数据是不可避免的。

我通常实现一种方法,用模型数据“绘制”视图。 UITableViewCell 子类中的类似内容:

-(void)configureWithAnimal:(NSManagedObject*)animal 
    self.nameLabel.text = [animal valueForKey:@"name"];
    self.speciesLabel.text = [animal valueForKey:@"species"];
    // Etc. 

这样,它是UITableViewController 子类中的一行代码来设置单元格,独立于新创建或重用的单元格。如果许多表想要重用自定义单元格,那么并非所有表格都需要重新实现代码来查看单元格。

【讨论】:

由于 UITableViewCells 无论如何都与模型对象紧密耦合,我认为这是一种可以接受的方式。纯粹主义者可能希望将此代码移动到控制器中(作为模型和视图之间唯一的“合法”中介),尽管我倾向于您的解决方案,不要让控制器承担太多责任。

以上是关于使用 Core Data 在视图中引用模型对象的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CoreDataViewModel 时如何在 Canvas 中预览 Core Data 对象

Core Data 逻辑分布?

Razor的使用

OS X Core Data - 将托管对象上下文传递给视图控制器

Core Data 中看似有效的对象出现“悬空引用无效对象”错误

Core Data 后台排序