我是目标C的新手,我有一个关于调度的问题。有人知道为什么添加到队列中的块没有运行吗?
int main(int argc, const char * argv[]) {
@autoreleasepool {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"hello world");
});
};
return 0;
}发布于 2020-01-31 12:23:25
在异步调度的块有机会执行之前,您的程序正在退出。这段代码基本上是在说“当这个程序的主线程空闲时,分派这个日志语句运行”,但实际上也是在说“分派该代码块异步运行(即稍后),然后立即退出”。正如您可以想象的那样,它只是在能够执行分派的块之前退出。
这种将代码分派到异步运行的模式在您编写一个成熟的“应用程序”(具有UI,用户可以在其中执行操作并在自己选择的时间退出应用程序)时最有意义,而不是“命令行工具”。如果您在应用程序中执行此操作,您将看到您的NSLog语句。因此,在创建测试项目时,创建一个“应用程序”而不是“命令行工具”。然后您将很好地看到您的日志语句。
这种将代码分派为异步运行的概念(特别是当您将代码分派到主队列时)对于大多数命令行工具来说并不是很有意义。从理论上讲,您可以创建自己的“run loop”来保持命令行工具的活动状态,直到您调度的块有机会运行为止,但这并不是一种非常常见的模式。大多数命令行工具只是执行某些操作,然后退出,并且不运行异步块。
如果有一些原因,你觉得你真的想在命令行应用中这样做,请编辑你的问题来更详细地描述你的场景。如果您只是在尝试GCD,那么使用“应用程序”而不是“命令行工具”来做这件事要简单得多。
https://stackoverflow.com/questions/59997031
复制相似问题