应用程序状态何时属于 Core Data 而不是 NSUserDefaults?

Posted

技术标签:

【中文标题】应用程序状态何时属于 Core Data 而不是 NSUserDefaults?【英文标题】:When does application state belong in Core Data instead of NSUserDefaults? 【发布时间】:2009-08-13 05:36:26 【问题描述】:

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

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

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

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

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

对于 NSUserDefaults 与数据模型,是否有人有过强硬的态度?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这是一个 iPhone 应用程序,在我的情况下属于基于库的方案。我喜欢考虑假设的多文档应用程序的心理模型,以及更改是否会使应用程序变脏。在我的情况下,它会,因为子列表的选择会更改更高列表的视图(具体来说,子选择会更改在更高视图中的项目旁边显示的图像)。关于排序,我的意思是排序顺序是用户定义的。也就是说,他们可以对列表进行任意排序(就像在 iTunes 中创建播放列表一样)。 在“它是否弄脏文档”的基础上,我还想添加“对数据的更改是否会导致添加到撤消堆栈”。撤消适用于基于文档和基于库的应用程序,因此它似乎是一种很好的启发式方法。【参考方案2】:

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

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

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

如果选择是数据的一个组成部分,那么一定要把它存储在数据中,如果你碰巧以这种方式使用 Core Data。

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

【讨论】:

我同意。我忘了说明我现有的模型是什么,所以我解决了我的问题(我相信这是在这里做的“正确的事情”)我很难确定信息是否是“数据的组成部分”。使用 Rentzsch 的模型(我会显示脏点),这变得更容易了,【参考方案3】:

我个人对将首选项保存在文件本身或 NSUSerDefaults 中没有严格的界限。

但我总是倾向于显而易见的:

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

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

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

【讨论】:

我认为这让我很困惑,因为在 iPhone 上我不一定认为任何应用程序都具有“文档”;这一切都只是数据。保存状态变得更加重要,因为切换应用程序意味着退出和重新启动。 我认为即使在 iPhone 应用程序中 - 如果用户当前位置的部分状态对数据很重要,我会保存它,如果不是,我不会打扰。听起来可能是这样,所以我将其与数据一起保存。

以上是关于应用程序状态何时属于 Core Data 而不是 NSUserDefaults?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Swift 中使用 Core Data 关系?

使用存储的 JSON 而不是 Core Data

iOS Core Data iCloud 同步 - 可选

Core-Data:想要将新的 web xml 内容持久保存到我的数据存储中,而不是替换现有的

如何切换到将 Core Data 用于简单的 UITableView 而不是 NSArray?

告知 iCloud 何时没有更多待处理的 Core Data 更新更改