核心数据和线程/大中央调度 [英] Core Data and threads / Grand Central Dispatch
问题描述
我是Grand Central Dispatch(GCD)和Core Data的初学者,我需要您帮助使用Core Data与CGD,这样当我添加40.000条记录到Core Data时,UI不会被锁定。
I'm a beginner with Grand Central Dispatch (GCD) and Core Data, and I need your help to use Core Data with CGD, so that the UI is not locked while I add 40.000 records to Core Data.
我知道CD不是线程安全的,所以我必须使用另一个上下文,然后保存数据和合并上下文,就我能从一些文章中理解。
I know that CD is not thread safe, so I have to use another context, and then save the data and merge contexts, as far as I was able to understand from some articles.
我现在还做不到的是把它们放在一起。
What I couldn't do yet, is put the pieces together.
我需要您的帮助。
我有:
/*some other code*/
for (NSDictionary *memberData in arrayWithResult) {
//get the Activities for this member
NSArray *arrayWithMemberActivities = [activitiesDict objectForKey:[memberData objectForKey:@"MemberID"]];
//create the Member, with the NSSet of Activities
[Members createMemberWithDataFromServer:memberData
andActivitiesArray:arrayWithMemberActivities
andStaffArray:nil
andContactsArray:nil
inManagedObjectContext:self.managedObjectContext];
}
如何将其转换为在后台工作,
How can I transform this to work on the background, and then, when done saving, save the data and update the UI, without blocking the UI while saving the 40.000 objects?
推荐答案
这里有一个很好的例子,你试试。如果您有任何问题,欢迎随时回来:
Here's a good example for you to try. Feel free to come back if you have any questions:
self.mainThreadContext... // This is a reference to your main thread context
NSPersistentStoreCoordinator *mainThreadContextStoreCoordinator = [self.mainThreadContext persistentStoreCoordinator];
dispatch_queue_t request_queue = dispatch_queue_create("com.yourapp.DescriptionOfMethod", NULL);
dispatch_async(request_queue, ^{
// Create a new managed object context
// Set its persistent store coordinator
NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
[newMoc setPersistentStoreCoordinator:mainThreadContextStoreCoordinator]];
// Register for context save changes notification
NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
[notify addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:newMoc];
// Do the work
// Your method here
// Call save on context (this will send a save notification and call the method below)
BOOL success = [newMoc save:&error];
if (!success)
// Deal with error
[newMoc release];
});
dispatch_release(request_queue);
并响应上下文保存通知:
And in response to the context save notification:
- (void)mergeChanges:(NSNotification*)notification
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainThreadContext mergeChangesFromContextDidSaveNotification:notification waitUntilDone:YES];
});
}
并且不要忘记从观察员完成后台线程上下文。
And don't forget to remove the observer from the notification center once you are done with the background thread context.
[[NSNotificationCenter defaultCenter] removeObserver:self];
这篇关于核心数据和线程/大中央调度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!