performblockandwait内部dispatch_async死锁

时间:2013-01-12 08:19:59

标签: ios core-data thread-safety grand-central-dispatch nsmanagedobjectcontext

我正在大量使用后台操作,我只是好奇这是否会导致死锁。我有一个Core Data Managed Object Context设置为使用performblockandwait从几个不同的线程引用(可能同时)的私有队列。在某些情况下,可以通过完成另一个后台任务来启动后台任务。

由于我的后台任务是在满足某些条件时启动的,因此可能会出现类似以下内容的情况,这可能发生在主线程或后台任务上的用户输入中。

- (void)task1
{
     __weak MyClass *weakself = self;

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{
         ....
         ....
         [context performBlockAndWait:^{
              BOOL condition = [weakself performDbCleanup];

              if (condition)
              {
                  [weakself task2];
              }
         }];
     });
}

- (void)task2
{
     __weak MyClass *weakself = self;

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{
         ....
         ....
         [context performBlockAndWait:^{
              [weakself performDbCleanup2];
         }];
     });
}

很难解释为什么我需要以这种方式做事,但我确实需要在两个实例中使用performBlockAndWait,因为这是正在发生的事情的高度简化版本。在performBlockAndWait调用之前和之后进行长时间处理,我不希望阻止访问数据库上下文,也不应该阻塞主线程。

0 个答案:

没有答案