我的应用有时会变成dead
,而调用堆栈就像下面一样,
更新
我花了两天时间但还是无法处理它。
我拥有的是每个线程的上下文,以及一个特殊串行队列的保留上下文。
我想知道的是僵局是怎么来的。 Why all the threads are in waiting states?
只有一种可能性值得赞赏。
非常感谢。
答案 0 :(得分:1)
有些时候,在通知处理程序中工作时可能会导致发送其他通知,最简单的方法就是调度_async需要完成的工作。
dispatch_async(dispatch_get_current_queue(), ^{
// The work that needs to be done...
});
答案 1 :(得分:0)
当使用主线程上下文 OR 同时在不同线程(背景或主要)上使用相同的托管对象上下文尝试访问后台线程上的Core Data对象时,通常会发生这种情况。有关详细信息,请查看Core Data concurrency rules。
因此,为了避免这两种情况,主要规则是,每个线程必须有自己的托管对象上下文,并准确地初始化该上下文。
例如:
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
//
.
.
.
});