1

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

我是否也应该将每个 NSManagedObject 访问器包装在 performBlockAndWait: 中?- 那会很混乱。每当 CoreData 的一对多关系出错而 CoreData 的私有队列正在使用 performBlock 执行时,我目前都会崩溃:

就像是:

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];
}];
4

1 回答 1

1

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

此外,当您有这样的陈述时:

NSManagedObject* alreadyFetchedObject = ...;

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

于 2013-11-12T09:32:34.233 回答