如何运行dispatch_async



在下面的代码中,在运行应用程序时,块变量内的日志

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-

相关内容

  • 没有找到相关文章

最新更新