首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_async(dispatch_get_main_queue()不工作

dispatch_async(dispatch_get_main_queue()不工作
EN

Stack Overflow用户
提问于 2020-01-31 10:10:27
回答 1查看 282关注 0票数 0

我是目标C的新手,我有一个关于调度的问题。有人知道为什么添加到队列中的块没有运行吗?

代码语言:javascript
复制
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        dispatch_async(dispatch_get_main_queue(), ^{        
            NSLog(@"hello world");   
        });    
    };

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2020-01-31 12:23:25

在异步调度的块有机会执行之前,您的程序正在退出。这段代码基本上是在说“当这个程序的主线程空闲时,分派这个日志语句运行”,但实际上也是在说“分派该代码块异步运行(即稍后),然后立即退出”。正如您可以想象的那样,它只是在能够执行分派的块之前退出。

这种将代码分派到异步运行的模式在您编写一个成熟的“应用程序”(具有UI,用户可以在其中执行操作并在自己选择的时间退出应用程序)时最有意义,而不是“命令行工具”。如果您在应用程序中执行此操作,您将看到您的NSLog语句。因此,在创建测试项目时,创建一个“应用程序”而不是“命令行工具”。然后您将很好地看到您的日志语句。

这种将代码分派为异步运行的概念(特别是当您将代码分派到主队列时)对于大多数命令行工具来说并不是很有意义。从理论上讲,您可以创建自己的“run loop”来保持命令行工具的活动状态,直到您调度的块有机会运行为止,但这并不是一种非常常见的模式。大多数命令行工具只是执行某些操作,然后退出,并且不运行异步块。

如果有一些原因,你觉得你真的想在命令行应用中这样做,请编辑你的问题来更详细地描述你的场景。如果您只是在尝试GCD,那么使用“应用程序”而不是“命令行工具”来做这件事要简单得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59997031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档