iOS NSArray, NSSet 与 Core Data Query (Fetch Request)

Posted

技术标签:

【中文标题】iOS NSArray, NSSet 与 Core Data Query (Fetch Request)【英文标题】:iOS NSArray, NSSet versus Core Data Query (Fetch Request) 【发布时间】:2013-09-19 17:26:09 【问题描述】:

我的老板和我正在尝试找出处理核心数据中数据的最佳方式,我们正在尝试找出两种不同处理方式的优缺点。我们正在研究不同方法的效率。

1) 我们将数据模型中的每个表存储到一个 NSArray 或 NSSet 中,并且仅在一行被修改或添加了一行时才发出获取请求。然后我们通过使用谓词过滤它们来操作 NSArray 和 NSSets 到我们需要的东西。

2) 我们一开始就设置了获取请求,只用复合谓词抓取我们需要的数据,然后从那里开始。

我们测试了两者之间的时间。选项 1) 0.000259 秒 选项 2) 0.000528 秒

我们也在考虑一些事情。选项 1 似乎更快,但仅仅是因为我们只处理了大约几百行数据,并且如果数组变得很大,比如我们开始达到一百万行,我们会遇到内存问题。

我们认为选项 2 应该是更快的选项,但还是因为没有足够的数据而变得更慢?如果有一百万行,它会遇到内存问题吗?

如果您能解释为什么一个会比另一个更有效率,那将不胜感激。

【问题讨论】:

【参考方案1】:

您不想将一百万个对象拉入内存然后在那里过滤它们。这是非常低效的。数据库已经过优化,非常适合过滤大型数据集。您应该让 SQLite 完成繁重的工作,而不是将所有对象推入整个 Core Data 堆栈。

如果可能,您通常应该通过关系来获取您的数据。

如果您需要使用获取请求(例如,因为您想要查询所有数据或想要搜索特定对象),那么您应该使您的谓词尽可能窄,并且只将对象拉入您真正的上下文中需要。

为了快速发出 fetch 请求,您应该将谓词从便宜到昂贵(请参阅 Apple 的 Predicate Programming Guide)并在实体上使用适当的索引。我们在objc.io issue #4,特别是Fetch Requests 中写了一些关于此的内容。

【讨论】:

【参考方案2】:

我对大型(r)数据集和NSArray's 有一些经验。到目前为止,我在数组中使用的最大数据集大约是 8200 行。我发现这种尺寸的东西性能很好。 1/2 百万的数组很可能会造成内存问题。

#2 较慢的原因是命中托管对象和Core Data 堆栈比简单地处理数组开销更大。

我的建议是构建一个测试应用程序,您可以使用它来填充一个大型数组,并查看您获得了什么样的性能以及内存问题可能是什么。为此使用 Instruments 将帮助您更好地了解在极端情况下哪种情况可能是最好的。

【讨论】:

在#1中,如果实体有大量的属性怎么办?并且某些属性可能包含大量数据?

以上是关于iOS NSArray, NSSet 与 Core Data Query (Fetch Request)的主要内容,如果未能解决你的问题,请参考以下文章

iOS笔记之NSSet

如何在 NSManagedObjects 的集合(NSArray 或 NSSet)上设置 KVO

[转]一些NSArray,NSDictionary,NSSet相关的算法知识

#私藏项目实操分享#iOS开发:NSSet的使用

iOS:跟踪 NSSet 对象的序列

整理出一份高级iOS面试题