我正在使用performBlock:和performBlockAndWait:方法在我的上下文中对只读数据库执行获取请求(它与我的应用程序打包在一起,所以永远不会写入)。
我是否应该在performBlockAndWait中包装每个NSManagedObject访问器: - 那太乱了。当CoreData的私有队列正在使用performBlock执行执行时,当CoreData发生一对多关系时,我当前正在崩溃:
类似的东西:
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];
}];
答案 0 :(得分:1)
是的,当然。可能是与已在主线程上执行的上下文关联的托管对象的例外。但为了清楚起见,我总是将访问包装到performBlock:
。小心performBlockAndWait:
- 这对于死锁很容易出错。
此外,如果你有这样的陈述:
NSManagedObject* alreadyFetchedObject = ...;
并稍后访问alreadyFetchedObject
,您需要确保相应的托管对象上下文仍然存在。因此,始终访问performBlock:
或performBlockAndWait:
的托管对象,提醒您不要意外删除上下文;)