【发布时间】:2014-05-30 20:47:01
【问题描述】:
我正在学习一些 NSCoreData,在介绍它之前我拥有的一些现有项目,我想验证我对核心原则的良好理解。 据我了解,NSCoreData 通过从 NSManagedObject 而不是从 NSObject 继承我们的 Model 类,可以更轻松地管理对象的本地存储(之后是 + 检索)。
对吗?
那我有几个问题。假设我正在构建一个房地产应用程序,其核心模型对象是可以表示公寓、房屋和所有相关信息的类 Property。目前它在我的应用程序中作为 NSObject 的子类进行管理。
1) 我通过搜索查询从服务器检索属性,并编写了一个initWithJson : 方法来填充每个实例。
现在,如果我从 NSManagedObject 继承 Property,我将使用
+(id)insertNewObjectForEntityForName:(NSString *)entityName
inManagedObjectContext:(NSManagedObjectContext *)context
我仍然可以在我的班级中添加populateWithJson: 来填写属性。
然后我会在当前的managedObjectContext中创建很多Property实例,如果我做一个保存,它们会存储在物理层。
如果我再次调用相同的 Web 服务并检索相同的 JSON 内容,我将重新创建相同的托管对象。
如何避免 [managedObjectContext save:&error] 调用的冗余,而不是多次物理存储单个现实生活中属性的表示?
2) 假设我只想在物理上存储一些属性,例如只存储用户想要收藏的属性。
[managedObjectContext save:&error] 会将所有创建/修改/删除的托管对象从上下文保存到物理层,而不仅仅是我想要的。
如何实现?
我是否应该声明另一个上下文(managedObjectContext2),移动我想要存储在那个上下文中的实例,然后在那个上下文中保存?
(我的意思是,我将有一个上下文来操作对象,从 JSON 创建实例并在 UI 中表示它们......以及第二个实际进行存储)
或者我应该存储所有对象,并添加一个 isFavorite BOOL 属性,然后使用该属性上的谓词进行获取?
3) 该应用程序有一个通用的导航模式:UITableView 列出了所需信息最少的 Properties 实例,并在详细视图中调用 Web 服务以请求有关特定 Property 实例的更多信息(图像、全文描述)。
仅当 property.fullDescription 为 nil 时才调用 web 服务,然后更新对象并将所有详细信息存储在本地,下一次仅使用谓词 on 在本地获取它,这是一个好习惯吗属性.id ? 那些在创建后可能会在服务器端更新的对象呢?
谢谢你的灯
【问题讨论】:
标签: ios objective-c core-data nsmanagedobject nsmanagedobjectcontext