我最近阅读了核心数据编程指南,Apple建议我们这样做
您在后台线程上获取一个托管对象上下文,并传递已获取的对象ID 对象到另一个线程。在第二个线程(通常是应用程序的主线程,以便您可以 然后显示结果),你使用第二个上下文来破坏具有这些对象ID的对象(你使用 objectWithID:实例化对象)。 (此技术仅在您使用SQLite存储时才有用,>因为来自二进制和XML存储的数据会在打开时立即读入内存。)
据我了解,在后台上下文中获取不会在主线程上下文中注册托管对象,因此从objectWithID返回的托管对象很可能是一个错误。当我们在主线程上使用它时,我们将触发SQLite Store的新一轮旅行。用户界面可能会受阻。
我错过了什么吗?有没有办法避免主线程上的I / O开销?
答案 0 :(得分:4)
当您在后台进行提取然后使用objectID在主线程上进行提取时,没有多少被无意中听到。首先,记录将在CoreData缓存上,这使得主线程上的相同提取更快,其次,使用objectID获取比使用平均获取请求获取要快得多。您通常做的是创建一个后台获取请求,找到您要查找的对象的objectID,并将这些objectID移动到主线程。当然,对于后台线程,您必须使用与主线程不同的NSManagedObjectContext实例。
我建议您查看WWDC 2010视频“掌握核心数据”。它涉及核心数据和多线程,解释了在后台/主线程上缓存和获取的性能。