我的应用程序有时会变成dead
,调用堆栈如下所示,
更新:
我已经花了两天时间,但还无法处理。
我拥有的是每个线程的上下文,以及一个特殊串行队列的保留上下文。
我想知道的是,僵局是怎么来的。Why all the threads are in waiting states?
只有一种可能性将不胜感激。
非常感谢。
我的应用程序有时会变成dead
,调用堆栈如下所示,
更新:
我已经花了两天时间,但还无法处理。
我拥有的是每个线程的上下文,以及一个特殊串行队列的保留上下文。
我想知道的是,僵局是怎么来的。Why all the threads are in waiting states?
只有一种可能性将不胜感激。
非常感谢。
在通知处理程序中执行可能导致发送其他通知的工作时,有时会发生这种情况,避免它的最简单方法是 dispatch_async 需要完成的工作。
dispatch_async(dispatch_get_current_queue(), ^{
// The work that needs to be done...
});
这通常发生在尝试使用主线程上下文访问后台线程上的核心数据对象或同时在不同线程(后台或主线程)上使用相同的托管对象上下文时。有关更多详细信息,请查看Core Data 并发规则。
因此,为了避免这两种情况,主要规则是,每个线程必须有自己的托管对象上下文,并在将要使用的位置准确地初始化该上下文。
例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//
// Prepare your background core data context
//
if (self.privateContext == nil)
{
self.privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[self.privateContext setParentContext: - main managed object context - ];
[self.privateContext setUndoManager:nil]; // this context should not manage undo actions.
}
//
// Do any Core Data requests using this thread-save context
//
.
.
.
});