在下面的代码中,在运行应用程序时,块变量内的日志
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);
它正在运行,但它是异步运行的,您只是在应用程序有机会完成之前退出它。如果你在一个GUI应用程序中尝试这一点,该应用程序在用户手动退出之前一直保持活动状态,你会看到它的行为与你预期的一样。
如果你在命令行应用程序中这样做,你可以使用调度组来等待调度的代码完成,例如:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultPriority = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultPriority, ^{
for (int i = 0; i < 10; i++) {
[NSThread sleepForTimeInterval:0.7];
NSLog(@"current i = %d", i);
}
});
NSLog(@"Waiting");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"All done");
在大多数GUI应用程序中,您通常不会这样做,但如果您真的希望命令行应用程序等待调度的代码完成,这将完成任务。
顺便问一下,你知道sleepForTimeInterval
使用秒而不是毫秒吗?也许你打算用0.7秒,而不是700秒?
假设">main"表示main()
启动函数,并且您显示的代码是main()
的整体,则:
一旦main()
返回,应用程序就会终止。因此,在您的情况下,block1
可能会开始执行,也可能不会开始执行,但应用程序会很快终止。
将行复制到标准GUI应用程序的applicationDidFinishLaunching:
(macOS(或application:didFinishLaunchingWithOptions:
(iOS(方法中,然后运行它。GUI应用程序是一个运行循环,它会一直运行,直到某个事件终止该应用程序,这样你的应用程序就会运行足够长的时间让你的block1
执行(你可能想在测试中将700
改为7
,或者你会等待很长时间等待它完成(。
HTH-