1

我最近阅读了核心数据编程指南,Apple 建议我们这样做

您在后台线程上获取一个托管对象上下文,并将获取的对象的对象 ID 传递给另一个线程。在第二个线程(通常是应用程序的主线程,以便您随后可以显示结果)中,您使用第二个上下文在具有这些对象 ID 的对象中出错(您使用 objectWithID: 来实例化对象)。(此技术仅在使用 SQLite 存储时才有用,> 因为来自二进制和 XML 存储的数据在打开时会立即读入内存。)

据我了解,在后台上下文中获取不会在主线程上下文中注册托管对象,因此从 objectWithID 返回的托管对象很可能是错误的。当我们在主线程上使用它时,我们将触发新一轮的 SQLite Store 之旅。所以用户界面可能被阻止了。

我错过了什么吗?有没有办法避免主线程上的 I/O 开销?

4

1 回答 1

4

当您在后台执行 fetch 然后使用 objectID 在主线程上执行 fetch 时,不会听到太多声音。首先,记录将在 CoreData 缓存中,这使得主线程上的相同获取更快,其次,使用 objectID 获取比使用平均获取请求获取快得多。您通常会创建一个后台获取请求,找到您正在寻找的对象的 objectID,然后将这些 objectID 移动到主线程。当然,对于后台线程,您必须使用与主线程不同的 NSManagedObjectContext 实例。

我建议您查看 WWDC 2010 视频“掌握核心数据”。它涉及核心数据和多线程,解释了在后台/主线程上缓存和获取的性能。

于 2012-08-30T12:57:53.630 回答