我正在使用performBlock:和performBlockAndWait:方法在只读数据库上对上下文执行获取请求(该数据包与我的应用程序打包在一起,因此从未写入过)。

我是否也应该将每个NSManagedObject访问器都包装在performBlockAndWait中: -太乱了。当前,每当CoreData的一对多关系出现故障而CoreData的 private 队列使用performBlock执行execute时,我都会崩溃:

就像是:

NSManagedObject* alreadyFetchedObject = ...;
NSArray* alreadyFetchedObject.otherObjects; // Crashes here on main thread (no performBlock wrapped around accessing otherObjects)


[context performBlockAndWait:^{
    // Currently executing here on CoreData's own queue
    result = [context executeFetchRequest:fetchRequest error:nil];
}];

最佳答案

当然是。也许与托管对象相关联,该托管对象已与在主线程上执行的上下文相关联。但是为了清楚起见,我总是将访问包装到performBlock:中。小心performBlockAndWait:-这很容易导致死锁。

此外,当您有这样的语句时:

NSManagedObject* alreadyFetchedObject = ...;

并在以后访问alreadyFetchedObject,您需要确保相应的托管对象上下文仍然存在。因此,始终使用performBlock:performBlockAndWait:访问托管对象会提醒您不要意外删除上下文;)

关于ios - CoreData的performBlock:和错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19925316/

10-09 06:30