在下面的代码中,在运行应用程序时,块变量内的日志
block1
从未执行过,只有
NSLog(@"Delay_Expired");
请让我知道如何运行dispatch_async
。
main
dispatch_block_t block1 = ^{
for (int i = 0; i < 10; i++) {
[NSThread sleepForTimeInterval: 700];
NSLog(@"current i = %d", i);
}
};
dispatch_queue_t defaultPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t backgroundPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
NSLog(@"Delay_Expired");
dispatch_async(defaultPriority, block1);
假设“ main”表示main()
启动功能,并且您显示的代码是main()
的整体,那么:
main()
返回后,该应用程序即被终止。因此,根据您的情况,block1
可能会开始执行,也可能不会开始执行,但是无论如何该应用都会迅速终止。
将行复制到标准GUI应用程序的applicationDidFinishLaunching:
(macOS)或application:didFinishLaunchingWithOptions:
(iOS)方法中,然后运行它。 GUI应用程序作为运行循环,可使其一直运行,直到某个事件终止该应用程序为止,这样您的应用程序将运行足够长的时间以使您的block1
执行(对于测试,您可能希望将700
更改为7
或您将等待很长时间才能完成)。
HTH
它正在运行,但是异步运行,而您只是在退出应用程序之前就退出了。如果您在GUI应用程序中尝试此操作,而该应用程序在用户手动退出之前一直处于活动状态,那么您会看到它的行为符合预期。
如果您在命令行应用程序中执行此操作,则可以使用调度组来等待调度的代码完成,例如:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"Delay_Expired");
dispatch_group_async(group, defaultPriority, ^{
for (int i = 0; i < 10; i++) {
[NSThread sleepForTimeInterval:0.7];
NSLog(@"current i = %d", i);
}
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
[通常,在大多数GUI应用程序中都不会这样做,但是如果您确实希望命令行应用程序等待分派的代码完成,则可以完成此工作。
顺便说一句,您知道sleepForTimeInterval
使用秒,而不是毫秒。也许您打算使用0.7秒而不是700秒?