Objective c iOS在后台更新核心数据实体时访问它们

Objective c iOS在后台更新核心数据实体时访问它们,objective-c,ios,core-data,concurrency,magicalrecord,Objective C,Ios,Core Data,Concurrency,Magicalrecord,在我的iOS应用程序中,当应用程序加载时,我正在点击一个web服务,以检查对我的核心数据数据库中各种表实体的更新 我在后台线程中执行此操作,这样用户仍然可以与应用程序交互 我遇到的问题是,当我尝试加载一个包含我从核心数据访问的实体表的视图时,应用程序会变得无响应,并且会延迟,直到后台更新完成 例如,如果我在后台更新任务时触摸查看任务表,是否可能获得无延迟体验 我正在使用MagicalRecord并在saveInBackgroundWithBlock中执行创建/更新 谢谢你的帮助 我最终没有使用M

在我的iOS应用程序中,当应用程序加载时,我正在点击一个web服务,以检查对我的核心数据数据库中各种表实体的更新

我在后台线程中执行此操作,这样用户仍然可以与应用程序交互

我遇到的问题是,当我尝试加载一个包含我从核心数据访问的实体表的视图时,应用程序会变得无响应,并且会延迟,直到后台更新完成

例如,如果我在后台更新任务时触摸查看任务表,是否可能获得无延迟体验

我正在使用MagicalRecord并在saveInBackgroundWithBlock中执行创建/更新


谢谢你的帮助

我最终没有使用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);
        }
 }];