6

我正在尝试确定某些应用程序状态,特别是列表中的选定项,是否应该存储在 Core Data 或 NSUserDefaults 中。

一般来说,我认为应用程序的偏好和状态应该保留在 NSUserDefaults 中,而模型级数据应该保留在其他地方,比如 Core Data。到目前为止,我的模型是:

  • 是否应该存储数据?如果用户不合理地期望它是,则将其丢弃(例如,光标位置未保存在 TextEdit 中)
  • NSUserDefaults:
    1. 如果应用程序是多文档,该设置将适用于所有文档
    2. 可以想象,数据将在首选项中配置
    3. 将数据放在模型之外对测试是有意义的(用一个模型存储交换多个默认值)
  • 模型级
    1. 数据显然属于模型级对象的属性
    2. 数据足够大,将其存储在 NSUserDefaults 中会导致性能问题
    3. 用户重新创建数据会很困难或很耗时(他们肯定会认为丢失这些信息是“数据丢失”)

我计划将某些实体的排序顺序存储在 Core Data 中。如果没有此信息(即“sortIndex”或“order”属性),每个实体实例都必须使用来自用户默认值的数据进行扩充。

然而,在模型中存储状态似乎是一个滑坡。如果我存储排序顺序,那么存储选择似乎也是合适的,因为它们都是列表的状态。我的用例的选择数据实际上可能非常大。具体来说,一个列表中的图标取决于其每个子列表中的选择。

是否有人对 NSUserDefaults 与数据模型有严格的规定?

4

3 回答 3

6

您没有提到这是基于文档的应用程序(例如 TextEdit)还是​​基于库的应用程序(例如 AddressBook)。

这可能会帮助您决定这些信息应该去哪里:假设一个基于文档的应用程序。假设它的文档被置于版本控制之下(这在使用 Core Data 的 XML 数据存储类型时实际上是可行的)。打开应用程序,更改文档的排序顺序。这会弄脏文档吗?这种变化值得入住吗?更改对该存储库的其他用户是否有价值?

通常,排序顺序的价值不足以保证基于文档的存储(在 Interface Builder 中使用 NSTableView 的自动保存名称)。但是您的应用程序可能会优先考虑排序(听起来很像)。

因此,没有硬性规定。但我认为将文档置于版本控制之下并可能与其他人共享的想法提供了一个很好的知识框架,可以为任何一方辩护。

于 2009-08-13T05:56:50.047 回答
2

我同意rentzsch,但另一种看待它的方式:

选择部分是数据还是元数据?如果是元数据,它是关于单个文档的元数据,还是应该适用于接下来碰巧打开的任何文档的状态?

特定于文档的元数据可能希望存储为扩展属性。例如,TextMate 以这种方式存储文档的选择,就像 BBEdit、MPW 和其他用于将选项卡设置、窗口大小等存储为资源叉中的资源一样。元数据被认为是可选的,如果将其剥离,则文档是完整的。

如果选择是数据的一个组成部分,那么请务必将其存储在数据中,如果您碰巧以这种方式摆动,请使用 Core Data。

如果它不是基于文档的应用程序,那么 NSUserDefaults 是最简单的路径,因为对它的支持通常通过绑定内置到常见的 NSView 子类中。

于 2009-08-13T06:29:46.750 回答
2

我个人在文件本身或 NSUSerDefaults 中保存首选项之间没有硬性界限。

但我一直倾向于显而易见的:

  • 应用程序首选项 = NSUSerDefaults
  • 文档首选项 = 在文件本身中

特别是对于选择状态,我会判断保持它对用户是否足够重要。如果它足够重要,并且足以将文档移动到另一台计算机,我会将其保存在文档本身中。

如果它不重要(或适用),我根本不会费心保存它。

于 2009-08-13T14:33:57.933 回答