gpt4 book ai didi

objective-c - dispatch_group_wait 永远等待

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:00 26 4
gpt4 key购买 nike

我正在研究 dispatch_async() 的工作原理。

我在 main() 中试过这个片段:

typedef void(^VoidBlock)();

VoidBlock aBlock = ^{
NSLog(@"do work in main queue");
};
dispatch_async(dispatch_get_main_queue(), aBlock);

但是 Block 永远不会被调用。我认为也许主线程在 block 运行之前结束。然后我试了这个:

dispatch_group_t aGroup = dispatch_group_create();
VoidBlock aBlock = ^{
NSLog(@"do work in main queue");
dispatch_group_leave(aGroup);
};
dispatch_group_enter(aGroup);
dispatch_async(dispatch_get_main_queue(), aBlock);
dispatch_group_wait(aGroup, DISPATCH_TIME_FOREVER);

这也不起作用(Block 没有被调用)。区别在于现在主线程(正确地)阻塞在语句 dispatch_group_wait(aGroup, DISPATCH_TIME_FOREVER)

有什么问题?

最佳答案

我怀疑您没有创建 iOS 项目(或任何其他触发运行循环的项目类型),而是创建了“命令行工具”。如果是这种情况:

您的第一种方法

一般来说,您的第一种方法没问题,但是 main() 在异步调用被触发之前返回(因此您的应用程序完成运行)。

您的第二种方法

您在第二种方法中的想法是正确的:WAITING异步作业完成。

不过您的实现导致了死锁。 wait 正在阻塞从(主线程)调用它的线程,直到您的 block 完成运行,但由于主线程被阻塞,该 block 永远不会运行。

解决方案

要解决此问题,请在与等待队列不同的队列上调度:

dispatch_group_t aGroup = dispatch_group_create();
VoidBlock aBlock = ^{
NSLog(@"do work in main queue");
dispatch_group_leave(aGroup);
};
dispatch_group_enter(aGroup);

// dispatch on another queue than the one wait will block
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), aBlock);
dispatch_group_wait(aGroup, DISPATCH_TIME_FOREVER);

这样主队列正在等待(阻塞),而你的 block 可以(正在)在另一个队列上执行。


@Ishahaks answer创建“单一 View 应用程序”而不是“命令行工具”也可以工作(因为问题最初被标记为“iOS”),即使在 main() 中也是如此。因此,原因是 iOS 应用程序触发了一个运行循环(while(true) {//wait for events}),因此应用程序在从 main() 返回后仍然运行。参见 Apples Runloop Documentation .

关于objective-c - dispatch_group_wait 永远等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957789/

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