NSKeyedArchiver与核心数据

时间:2015-03-26 15:22:01

标签: ios cocoa core-data nskeyedarchiver

我正在使用Objective-C构建应用程序,我想保留数据。我在NSKeyedArchiver和核心数据之间犹豫不决。我知道网上有很多关于此的资源(包括Objective-C best choice for saving data),但我仍然怀疑我应该使用的那个。以下是让我惊讶的两件事:

(1)我假设我将拥有大约1000-10000个对象来处理1-10 Mb的数据量。我将对这些对象进行标准数据库查询。我希望能够在启动时加载所有这些对象并不时保存它们 - 加载或保存的1秒处理时间对我来说没问题。

(2)目前我的模型相当错综复杂:例如,classA包含了其他属性中的一个classB数组,它本身由(其中包括)classC类型的属性和classD类型的属性组成。 D类本身包含classE类型的属性。

我是否正确地假设(1)意味着NSKeyedArchiver仍然可以正常工作,(2)意味着使用核心数据可能不是很简单?我试图寻找核心数据与复杂对象图结构一起使用的情况,例如我在网上的案例(2),但却找不到许多资源。这暂时是使用它的最大因素。

1 个答案:

答案 0 :(得分:2)

你识别的两件事都让我倾向于使用CoreData而不是NSKeyedArchiver:

  1. CoreData能够很好地处理10,000个对象(如果不是更多),它可以支持相对简单的数据库类型"查询数据(使用NSSortDescriptors排序,使用NSPredicate过滤)。可以实现的目标存在限制,但最糟糕的情况是您可以将所有数据加载到内存中 - 这就是您需要对NSKeyedArchiver解决方案进行的操作。

    在亚秒级加载应该是可以实现的(我已经测试了10,000个对象,总计14Mb,在模拟器中0.17秒),特别是如果你优化最初只加载基本数据,并让CoreData&# 39;故障过程在必要时引入额外数据。再次,这将比NSKeyedArchiver更好。

  2. 虽然大多数演示/教程选择相对简单的数据模型(足以演示属性和关系),但CoreData可以应对更复杂的数据模型。下面是您描述的关系的模型,花了几分钟时间组合在一起:

  3. Data Model

    如果为所有这些实体生成子类,则遍历这些关系很简单(向前和向后 - 自动管理反向关系)。同样,还有一些限制(CoreData为您提供了SQL工作,但这样做不如直接使用关系数据库那么灵活。)

    希望有所帮助。