【发布时间】: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 ,因为它将在主线程以外的不同线程上使用。我可能想错了--
-
只需在块内添加一个简单的
NSAssert:NSAssert(localContext == [NSManagedObjectContext MR_defaultContext], nil);
标签: objective-c ios core-data concurrency magicalrecord