我有一个类似这样的CoreData堆栈:
Persistent Store -> (private)writingContext -> (main)UIContext
-> (private)backgroundContext
这是一个常用的建议堆栈,可用于各种博客和掌握CoreData的人,但其他人将使backgroundContext成为主要上下文的子项。但这不是我所看到的问题。我拥有的是
[[self masterManagedObjectContext] performBlock:^{
NSError *error = nil;
BOOL saved = [self.masterManagedObjectContext save:&error];
if (!saved) {
// do some real error handling
[EventLogger logError:@"CoreDataService" message:@"masterContext save ERROR" error:error];
}
}];
现在这是从UIContext执行的,performBlock在一个块中调用此主保存,因为它不阻塞下一个要运行的代码是一个tableView重新加载,它获取所获取的对象,访问属性并将它们放在tableViewCells上。我在这里遇到了死锁,因为保存仍在运行但是UIContext正在访问进入主服务器的属性值以将值拉入内存。这种情况一直发生。
根据我的理解,上下文不会在一个有队列的线程上运行,如果主人正在做某事并且孩子正在同时请求某事,那么UI就是主人的孩子时间,它造成了僵局。我该如何避免这种情况?我如何异步保存UI中的内容,而不是在访问NSManagedObject的属性时死锁?