【问题标题】:Understanding of NSCoreData and MSManagedObject subclasses理解 NSCoreData 和 MSManagedObject 子类
【发布时间】: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


    【解决方案1】:

    1) 将服务器数据检索到一个临时形式(字典数组?),然后对于数组中的每个可能属性,检查您是否在 Core Data 中已经有一个匹配的对象。如果这样做,请忽略它或更新任何更改的属性;如果没有,创建一个Property 对象。

    2) 确定您希望保留哪些内容以支持您的应用功能。为不想保存的东西创建托管对象是没有意义的。但请注意,如果您同时需要 PropertyFavoriteProperty,Core Data 支持子类。

    3) 完全取决于您的“业务规则”……。您需要多久更新一次本地数据?唯一的技术考虑可能是不将可按需重新创建的大文件保存在本地的准则。

    【讨论】:

    • 1) 因此,如果我已经存储了相同的对象,我可以简单地使用获取请求 + 谓词进行检查,然后相应地检索它或在概念中插入一个新对象。为每个 JSON 字典检查物理存储中对象是否存在的性能成本如何? 2)如果理解得好,如果我不打算系统地使用保存,那么对我的对象使用 NSManagedObject 子类而不是传统的 NSObject 子类不是一个好主意:(我的意思是,在假设用例的情况下,对类使用 CoreData 没有意义本地存储)3)谢谢,很高兴知道:)
    • 是的,查找是有成本的,但这是最安全的方式。大概它可以在后台线程上完成,并且不会每隔几秒钟发生一次。另一种选择是采用使Property唯一的任何标识符,并将这些数组分别存储在用户默认值中,但保持该列表与实际存储的对象同步通常比使用Core Data作为权威来确定是否有东西需要添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多