我有iOS中9核心数据有问题,我没有在iOS的8的iOS 9核心数据线程
我有多个NSManagedObjectContext
对象的环境。父context
是并发类型NSMainQueueConcurrencyType
,并且所有视图控制器都有自己的子对象context
。我使用这种系统的原因是因为我想拥有更多独立的contexts
,并且只有在我决定完成时才合并它们。子context
在私有队列上,因为它在后面的线程上工作,然后在父主线context
上工作,父主线程将更改传播到数据库并在主线程上完成它所需的工作。
所有这一切都很好,直到iOS 9。我得到的行为是相当奇怪的。例如,当我添加A类型的新对象时,它会传播到存储。如果我在同一个vc上添加另一个类型为A的对象,使用相同的context
,但是从另一个按钮,moc的performBlockAndWait:
未被调用,并且我的应用冻结,控制台中没有任何消息。如果尝试使用第一个按钮,它会每次都通过。
- (BOOL)saveChildContext:(NSManagedObjectContext*)childContext
{
[childContext performBlockAndWait:^{
NSError* error;
[childContext save:&error];
[_managedObjectContext performBlock:^{
NSError* parentError;
[_managedObjectContext save:&parentError];
}];
}];
}
如果我叫performBlock:
,一切都在这两种情况下的罚款。所以我想通了,这可能是由于一些错误的线程。另一方面,使用相同类型的对象相同的线程,但另一个按钮,一切都很好。这让我感到困惑,并且怀疑它与线程有关。
我的问题:
1)是否会对后面的线程子context
对象,并有context
是保存到数据库,再返回到GUI上的主线,还是有更好的惯例的正确方法,并如果有的话,为什么?
2)代码在iOS 8上工作。但是,它似乎不会输入performBlockAndWait:
方法。为什么有时这个块不会被执行?是否有其他线程阻塞?如何找出这是否是这种情况?
要解决您的按钮的特定问题,您必须发布显示两个按钮之间区别的代码。 – Mundi
我认为问题可能在于,因为其他选项从未造成死锁或其他任何事情。不知何故,我使用了两种不同的上下文。我真的不知道我是如何设法建立由两个不同的上下文获取的两个对象之间的关系。还有一点很奇怪的是,当我调用异步performBlock时,它仍然没有问题地到达DB。 –