我是目标C的新手,我有一个关于派遣的问题。有谁知道为什么添加到队列中的块没有运行?
int main(int argc, const char * argv[]) {
@autoreleasepool {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"hello world");
});
};
return 0;
}
您的程序正在退出,异步分配的块才有机会执行。该代码基本上是在说“在该程序的主线程空闲时调度此日志语句以运行”,但实际上也是在说“调度该代码块异步运行(即稍后),然后立即退出”。可以想象,它只是在能够执行该调度块之前就退出了。
这种异步分发代码的方式在编写功能强大的“应用程序”(使用UI时用户可以在自己选择的时候做事情并退出应用程序的UI)时最有意义,而不是“命令行工具”。如果您在应用程序中执行此操作,则会看到NSLog
语句。因此,在创建测试项目时,请创建“应用程序”而不是“命令行工具”。然后,您会看到日志语句正常。
这种分配代码以异步方式运行的概念(特别是当您将其分配到主队列时,对于大多数命令行工具而言,意义不大)。从理论上讲,您可以创建自己的“运行循环”以使命令行工具保持活动状态,直到您的分派块有机会运行为止,但这不是很常见的模式。大多数命令行工具只是先执行某项操作然后退出,并且没有运行异步块。
[如果出于某些原因,您确实希望在命令行应用程序中执行此操作,请编辑问题以更详细地描述您的情况。如果您只是尝试使用GCD,那么使用“应用程序”而不是“命令行工具”进行操作会更简单。