如何使dispatch_async运行

问题描述 投票:0回答:2

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

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);
ios objective-c grand-central-dispatch dispatch
2个回答
1
投票

假设“ main”表示main()启动功能,并且您显示的代码是main()的整体,那么:

main()返回后,该应用程序即被终止。因此,根据您的情况,block1可能会开始执行,也可能不会开始执行,但是无论如何该应用都会迅速终止。

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

HTH


0
投票

它正在运行,但是异步运行,而您只是在退出应用程序之前就退出了。如果您在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秒?

© www.soinside.com 2019 - 2024. All rights reserved.