Ios 无限循环中的专用队列NSManagedObjectContext保存结束
我在主线程上有一个mainIos 无限循环中的专用队列NSManagedObjectContext保存结束,ios,objective-c,xcode,multithreading,core-data,Ios,Objective C,Xcode,Multithreading,Core Data,我在主线程上有一个mainNSManagedObjectContext对象。以及一个私有队列NSManagedObjectContext,用于在不影响主线程的情况下快速执行NSManagedObject操作 初始化此专用队列的代码如下所示: NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
NSManagedObjectContext
对象。以及一个私有队列NSManagedObjectContext
,用于在不影响主线程的情况下快速执行NSManagedObject
操作
初始化此专用队列的代码如下所示:
NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tempContext.parentContext = _context;
NSLog(@"LALALA");
[tempContext performBlock:^{
//do some work
NSError *error;
if([tempContext hasChanges]){
[tempContext save:&error];
}
[_appDelegate saveMainContextWithCompletion:^{
// do some work
}];
}];
应用程序冻结在[tempContext save&error]
,我使用仪器查看发生了什么。它显示没有内存泄漏,但我在内存中看到了无限的mallocCFString
有人能告诉我为什么会发生此错误吗?由于tempContext不在主线程中,请将代码包装为:
if (tempContext != nil) {
[tempContext performBlock:^{
NSError *error = nil;
if ([tempContext hasChanges] && ![tempContext save:&error]) {
NSLog(@"error: %@\n UserInfo: %@\n", error, [error userInfo]);
}
else {
//No error
}
}];
}
希望这有帮助:) 问题可能在于您在应用程序委托和saveMainContextWithCompletion方法中执行的操作。您可能无意中导致后台线程和主线程保持相互发布块以进行保存和合并 与其这样做,不如让后台上下文完成保存,并依赖managedObjectContextDidSaveNotification响应主线程上的更改
最后,由于您设置了父上下文关系,您在后台上下文中所做的更改应该会为您传播。您不需要显式地保存这两个上下文。您在执行块中做的是什么工作?@AdeelUrRehman只需从
tempContext
中获取一些NSManagedObject
,并为一些属性分配新值,然后保存即可。顺便说一句,我正在使用NSfetchedResultsController
和UITableView
。嗨,亚瑟。我投了否决票,因为在你提出这个问题的同一天,有两个答案出现了,其中一个仍然没有得到答复,两个答案都没有被投票通过。请回复那些付出时间和努力的人。谢谢谢谢你的建议,拉沙德。它不起作用。[tempContext save:&error]
方法永远不会返回。它在无限地运行。