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