Slo*_*ree 62 iphone multithreading core-data ios
我正在尝试以多线程方式使用核心数据.我只是想在后台下载新数据时显示以前下载的数据的应用程序.这应该让用户在更新过程中访问应用程序.
我有一个NSURLConnection使用委托异步下载文件(并显示进度),然后我使用XMLParser解析新数据并在单独的上下文中创建新的NSManagedObjects,具有自己的persistentStore并使用单独的线程.
问题是在显示新对象时在旧对象的同一上下文中创建新对象会抛出BAD_INSTRUCTION异常.所以,我决定为新数据使用单独的上下文,但是我无法找到一种方法,一旦完成就将所有对象移动到其他上下文.
Paolo又名SlowTree
Yuj*_*uji 151
带有Core Data文档的Apple Concurrency是开始的地方.仔细阅读它...我被误解了很多次!
基本规则是:
NSPersistentStoreCoordinator每个程序使用一个.每个线程你不需要它们.NSManagedObjectContext每个线程创建一个.NSManagedObject线程传递给另一个线程.-objectID并将其传递给另一个线程.更多规则:
NSManagedObjectContext的-mergeChangesFromContextDidSaveNotification:是有帮助的.但让我再说一遍,请仔细阅读文件!这真的很值得!
Jos*_*phH 76
目前[2015年5月] 带有核心数据的Apple Concurrency文档充其量是非常误导性的,因为它没有涵盖iOS 5中的任何增强功能,因此不再显示同时使用核心数据的最佳方法.iOS 5中有两个非常重要的变化 - 父上下文和新的并发/线程类型.
我还没有找到任何全面涵盖这些新功能的书面文档,但WWDC 2012视频"会话214 - 核心数据最佳实践"确实解释了这一切.
Magical Record使用这些新功能,值得一看.
真正的基础仍然是相同的 - 您仍然只能使用托管对象创建其托管对象上下文的线程.
您现在可以使用[moc performBlock:]在正确的线程上运行代码.
没有必要再使用mergeChangesFromContextDidSaveNotification:而是创建一个子上下文来进行更改,然后保存子上下文.保存子上下文将自动将更改推送到父上下文,并将更改保存到磁盘,只需在其主题上执行父上下文的保存.
为此,您必须使用并发类型创建父上下文,例如:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
Run Code Online (Sandbox Code Playgroud)
然后在后台线程:
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];
<... perform actions on context ...>
NSError *error;
if (![context save:&error])
{
<... handle error ...>
}
[mainManagedObjectContext performBlock:^{
NSError *e = nil;
if (![mainContext save:&e])
{
<... handle error ...>
}
}];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39719 次 |
| 最近记录: |