私有队列 NSManagedObjectContext 在无限循环中保存结束
Posted
技术标签:
【中文标题】私有队列 NSManagedObjectContext 在无限循环中保存结束【英文标题】:Private queue NSManagedObjectContext save end in infinite loop 【发布时间】:2014-12-29 04:25:25 【问题描述】:我在主线程上有一个主 NSManagedObjectContext
对象。还有一个私有队列NSManagedObjectContext
可以在不影响主线程的情况下进行快速的NSManagedObject
操作。
初始化这个私有队列NSManagedObjectContext
的代码如下:
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]
冻结,我使用 Instrument 来查看发生了什么。它显示没有内存泄漏,但我看到它在内存中无限地 malloc CFString
。
谁能告诉我为什么会出现这个错误?
【问题讨论】:
你在perform block中做了什么样的工作? @AdeelUrRehman 从tempContext
中获取一些NSManagedObject
并为一些属性分配新值,然后保存。顺便说一句,我将它与NSfetchedResultsController
和UITableView
一起使用。
嗨亚瑟。我投了反对票,因为在你问这个问题的同一天有两个答案出现,一个仍然没有回应,也没有被投票。请对付出时间和精力的人做出回应。谢谢!
【参考方案1】:
由于 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
];
希望这会有所帮助.. :)
【讨论】:
感谢您的建议,拉沙德。它不起作用。[tempContext save:&error]
方法永远不会返回。它无限运行。【参考方案2】:
问题可能在于您在应用程序委托和 saveMainContextWithCompletion 方法中所做的任何事情。您可能无意中导致后台线程和主线程不断向对方发布块以进行保存和合并。
您应该让后台上下文完成保存,并依靠 managedObjectContextDidSaveNotification 来响应主线程上的这些更改,而不是这样做。
最后,由于您设置了父上下文关系,因此您在后台上下文中所做的更改应该会为您传播。您不需要显式保存这两个上下文。
【讨论】:
以上是关于私有队列 NSManagedObjectContext 在无限循环中保存结束的主要内容,如果未能解决你的问题,请参考以下文章
多上下文麻烦。无法在 Core Data 中创建两个队列(主队列和私有队列)保存数据