【问题标题】:iOS Access Core Data Entities while updating them in backgroundiOS 访问核心数据实体,同时在后台更新它们
【发布时间】:2013-01-07 17:44:18
【问题描述】:

在我的 iOS 应用程序中,当应用程序加载以检查我的 Core Data DB 中各种表(实体)的更新时,我正在访问 Web 服务。

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

我遇到的问题是,当我尝试加载包含我从 Core Data 访问的实体表的视图时 - 应用程序变得无响应并滞后,直到后台更新完成。

如果我在后台更新这些“任务”时触摸以查看我的“任务”表,是否可以获得无延迟的体验?

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

 [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);
        }
 }]; 

感谢您的帮助!

【问题讨论】:

  • 你在哪里初始化你的NSManagedObjectContext?初始化它的并发类型是一个需要考虑的重要因素。
  • @JacobRelkin 在我的 AppDelegate 中,我使用以下行初始化我的主 NSManagedObjectContext:_managedObjectContext= [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 然后我使用 MagicalRecord 函数来访问它。
  • 块内给你的NSManagedObjectContext实例是否等于+[NSManagedObjectContext MR_defaultContext]
  • @JacobRelkin 嗯,我不确定——我假设 localContext 是一个单独的 NSManagedObjectContext ,因为它将在主线程以外的不同线程上使用。我可能想错了--
  • 只需在块内添加一个简单的NSAssertNSAssert(localContext == [NSManagedObjectContext MR_defaultContext], nil);

标签: objective-c ios core-data concurrency magicalrecord


【解决方案1】:

我最终没有使用 MagicalRecord 来获得我正在寻找的行为——我关注了这篇文章:

https://stackoverflow.com/a/11814957/480415

现在在后台更新实体时我的 UI 没有被锁定。

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2013-02-22
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多