由于__psynch_mutexwait,UI无响应

时间:2013-05-23 14:58:21

标签: iphone ios objective-c core-data deadlock

我的应用有时会变成dead,而调用堆栈就像下面一样,


更新

enter image description here

enter image description here


enter image description here

enter image description here

我花了两天时间但还是无法处理它。

我拥有的是每个线程的上下文,以及一个特殊串行队列的保留上下文。

我想知道的是僵局是怎么来的。 Why all the threads are in waiting states?只有一种可能性值得赞赏。

非常感谢。

2 个答案:

答案 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
   //

   .
   .
   .

});