0

我大量使用后台操作,我只是好奇这是否会导致死锁。我有一个核心数据托管对象上下文设置为使用一个私有队列,该队列使用 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 调用之前和之后,我不想阻塞对 DB 上下文的访问,也不应该阻塞主线程。

4

0 回答 0