Ios performblockandwait内部调度\u异步死锁

Ios performblockandwait内部调度\u异步死锁,ios,core-data,thread-safety,grand-central-dispatch,nsmanagedobjectcontext,Ios,Core Data,Thread Safety,Grand Central Dispatch,Nsmanagedobjectcontext,我正在大量使用后台操作,我只是好奇这是否会导致死锁。我有一个核心数据管理对象上下文集,用于使用私有队列,该队列使用performblockandwait从几个不同的线程引用(可能同时引用)。在某些情况下,可以通过完成另一个后台任务来启动后台任务 - (void)task1 { __weak MyClass *weakself = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BA

我正在大量使用后台操作,我只是好奇这是否会导致死锁。我有一个核心数据管理对象上下文集,用于使用私有队列,该队列使用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];
         }];
     });
}
类似于以下的情况是可能的,因为我的后台任务是在满足某些条件时启动的,这些条件可能来自用户在主线程或后台任务上的输入

- (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];
         }];
     });
}

很难确切地解释为什么我需要这样做,但在这两种情况下我都需要performblock和wait,因为这是正在发生的事情的高度简化版本。长时间的处理发生在performBlockAndWait调用之前和之后,我不想阻止对DB上下文的访问,也不应该阻止主线程。

为什么不能调用
-performBlock:
并摆脱
调度\u async
?我的数据库经常被访问。我想我会将与访问数据库无关的代码放在它自己的块中,该块使用dispatch\u async运行,以确保不会在DB队列上安排太多工作。我不明白这一切是如何正确工作的吗?如果您有长期运行的后台操作,我建议您创建一个子上下文,并使用
performBlock
,然后保存更改并将其推送到父上下文。