如何使用CoreData

时间:2017-07-19 16:33:15

标签: ios objective-c core-data

我有一个类似这样的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的属性时死锁?

0 个答案:

没有答案