繁体   English   中英

如何让 dispatch_async 运行

[英]How to get the dispatch_async running

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

block1

永远不会被处决,只有

NSLog(@"Delay_Expired");

请让我知道如何让dispatch_async运行。

主要的

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()启动 function 并且您显示的代码是main()的整个主体,那么:

一旦main()返回,应用程序就会终止。 因此,在您的情况下, block1可能会或可能不会开始执行,但无论如何应用程序都会快速终止。

将您的行复制到标准 GUI 应用程序的applicationDidFinishLaunching: (macOS) 或application:didFinishLaunchingWithOptions: (iOS) 方法中,然后运行它。 一个作为运行循环的 GUI 应用程序,它一直运行直到某个事件终止应用程序,因此您的应用程序将运行足够长的时间让您的block1执行(您可能希望将700更改为7进行测试,或者您将等待很长一段时间才能完成)。

高温高压

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM