我正在大量使用后台操作,我只是好奇这是否会导致死锁。我有一个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调用之前和之后进行长时间处理,我不希望阻止访问数据库上下文,也不应该阻塞主线程。