gpt4 book ai didi

ios - 未调用dispatch_async block

转载 作者:行者123 更新时间:2023-12-03 16:57:11 25 4
gpt4 key购买 nike

我遇到了一个以前从未见过的问题。我从没想过它可能存在。我正在使用 DFCache 库,并且在某个时刻使用全局队列的 dispatch_async 不会执行 block 。

- (void)cachedObjectForKey:(NSString *)key completion:(void (^)(id))completion {
if (!key.length) {
_dwarf_cache_callback(completion, nil);
return;
}
id object = [self.memoryCache objectForKey:key];
if (object != nil) {
_dwarf_cache_callback(completion, object);
return;
}

NSLog(@"Before calling async %d queue %p", [NSThread isMainThread], _processingQueue);

dispatch_async(_processingQueue, ^{
NSLog(@"Block called");

@autoreleasepool {


id object = [self _cachedObjectForKey:key];
_dwarf_cache_callback(completion, object);
}
});

}

这就是队列的创建方式:

 _processingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

队列从未在任何其他地方使用过。这不是我的代码。这是DFCache库的代码。但是我的代码中有些东西影响了队列,因为它总是在特定时刻停止工作。我加载,保存,加载,保存,加载......该 block 没有被调用。但我不明白为什么。我需要知道什么可能导致在 dispatch_async 上不调用该 block 。我的代码是如此庞大和复杂,所以我不会将其发布在这里。我需要的是一个提示。什么具体原因可能导致这种行为?您是否曾经看到 dispatch_async 没有在全局队列上调用其 block ?是什么原因造成的?

最佳答案

如果您在日志消息中看到“在调用 async ... 之前”,但没有看到“调用 block ”,一种可能的情况是所有线程都在全局队列中被阻塞。

例如,下面的代码应该无限地打印“Block Called”,但事实并非如此。

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q, ^{
while (YES) {
dispatch_async(q, ^{
NSLog(@"Block called\n");

// BLOCK THE THREAD
while (YES)
;
});
}
});

系统为全局队列准备了一个线程池。池中的线程数量可能会根据运行时状态而变化,无论如何,线程数量是有限的。最终,所有线程都会被无限循环阻塞。

因此,您的代码可能会出现一些死锁、无限循环或阻塞全局队列线程的情况。

关于ios - 未调用dispatch_async block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com