核心数据和线程/中央大调度

我是Grand Central Dispatch(GCD)和核心数据的初学者,我需要您的帮助将核心数据与CGD一起使用,这样在我向核心数据添加40000条记录时,UI不会被锁定

我知道CD不是线程安全的,所以我必须使用另一个上下文,然后保存数据并合并上下文,正如我从一些文章中所能理解的那样

我还不能做的是把这些碎片拼在一起

所以,在我的代码中,我需要你的帮助来实现这一点

我有:

/*其他一些代码*/
for(NSDictionary*arrayWithResult中的memberData){
//获取此成员的活动
NSArray*arrayWithMemberActivities=[activitiesDict objectForKey:[memberData objectForKey:@“MemberID”];
//使用NSSet活动创建成员
[成员createMemberWithDataFromServer:memberData
AndActivityArray:arrayWithMemberActivities
和斯塔法雷:零
联系人:无
inManagedObjectContext:self.managedObjectContext];
}

如何将其转换为在后台工作,然后在保存完成后保存数据并更新UI,而不在保存40000个对象时阻塞UI

这里有一个很好的例子供您尝试。如果您有任何问题,请随时回来:

self.mainThreadContext…//这是对主线程上下文的引用
NSPersistentStoreCoordinator*mainThreadContextStoreCoordinator=[self.mainThreadContext persistentStoreCoordinator];
dispatch\u queue\u t request\u queue=dispatch\u queue\u create(“com.yourapp.DescriptionOfMethod”,NULL);
调度异步(请求队列^{
//创建新的托管对象上下文
//设置其持久存储协调器
NSManagedObjectContext*newMoc=[[NSManagedObjectContext alloc]init];
[newMoc setPersistentStoreCoordinator:mainThreadContextStoreCoordinator]];
//注册上下文保存更改通知
NSNotificationCenter*通知=[NSNotificationCenter defaultCenter];
[通知addObserver:self]
选择器:@选择器(合并更改:)
名称:NSManagedObjectContextDidSaveNotification
对象:新MOC];
//做这项工作
//你的方法在这里
//调用上下文保存(这将发送保存通知并调用下面的方法)
BOOL success=[newMoc save:&error];
如果(!成功)
//处理错误
[新MOC发布];
});
调度发布(请求队列);

并响应上下文保存通知:

-(无效)合并更改:(NSNotification*)通知
{
dispatch\u async(dispatch\u get\u main\u queue()^{
[self.mainThreadContext mergeChangesFromContextDidSaveNotification:notification waitUntilDone:YES];
});
}

并且,在完成后台线程上下文后,不要忘记从通知中心删除观察者

[[NSNotificationCenter defaultCenter]移除观察者:self];

发表评论