Objective c iOS在后台更新核心数据实体时访问它们
在我的iOS应用程序中,当应用程序加载时,我正在点击一个web服务,以检查对我的核心数据数据库中各种表实体的更新 我在后台线程中执行此操作,这样用户仍然可以与应用程序交互 我遇到的问题是,当我尝试加载一个包含我从核心数据访问的实体表的视图时,应用程序会变得无响应,并且会延迟,直到后台更新完成 例如,如果我在后台更新任务时触摸查看任务表,是否可能获得无延迟体验 我正在使用MagicalRecord并在saveInBackgroundWithBlock中执行创建/更新Objective c iOS在后台更新核心数据实体时访问它们,objective-c,ios,core-data,concurrency,magicalrecord,Objective C,Ios,Core Data,Concurrency,Magicalrecord,在我的iOS应用程序中,当应用程序加载时,我正在点击一个web服务,以检查对我的核心数据数据库中各种表实体的更新 我在后台线程中执行此操作,这样用户仍然可以与应用程序交互 我遇到的问题是,当我尝试加载一个包含我从核心数据访问的实体表的视图时,应用程序会变得无响应,并且会延迟,直到后台更新完成 例如,如果我在后台更新任务时触摸查看任务表,是否可能获得无延迟体验 我正在使用MagicalRecord并在saveInBackgroundWithBlock中执行创建/更新 谢谢你的帮助 我最终没有使用M
谢谢你的帮助 我最终没有使用MagicalRecord获得我想要的行为-我遵循了以下帖子:
现在,在后台更新实体时,我的UI没有被锁定。在哪里初始化NSManagedObjectContext?它初始化的并发类型是一个需要考虑的重要因素。@在我的AppDeaveI中,我使用NSManagedObjectContext:然后,我使用MagicalRecord函数访问它。块中提供给您的NSManagedObjectContext实例是否等于+[NSManagedObjectContext MR_defaultContext]?@JacobRelkin嗯,我不确定-我假设localContext是一个单独的NSManagedObjectContext,因为它将在主线程以外的其他线程上使用。我可能认为这是错误的,只需在块中添加一个简单的NSAssert:NSAssertlocalContext==[NSManagedObjectContext MR_defaultContext],nil;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){
//UserTasks
if([viewName isEqualToString:[[NSString stringWithFormat:@"UserTask_vw_iSales"] lowercaseString]])
{
//returns a UserTask or nil if one does not exist
UserTask *oldUserTask = [UserTask doesExist:[record valueForKey:@"JSONData"]];
if(oldUserTask)
{
NSLog(@"deleting old UserTask");
[UserTask MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"userTaskUID == %@", oldUserTask.userTaskUID] inContext:localContext];
}
//create new one
UserTask *utt = [UserTask MR_createInContext:localContext];
[utt initWithJSONSting:[record valueForKey:@"JSONData"]];
NSLog(@"Creating UserTaskType: %@", utt.userTaskUID);
}
}];