Как запустить dispatch_async - PullRequest
       59

Как запустить dispatch_async

1 голос
/ 03 ноября 2019

В приведенном ниже коде при запуске приложения журнал внутри переменной блока

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);

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Он работает, но работает асинхронно, и вы просто выходите из своего приложения, прежде чем оно сможет завершиться. Если вы попробуете это в приложении с графическим интерфейсом, которое остается активным, пока пользователь не завершит работу вручную, вы увидите, что оно ведет себя так, как вы ожидали.

Если вы делаете это в приложении командной строки, вы можете использовать группы рассылки для ожидания завершения отправки кода, например:

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");

Обычно вы этого не делаетев большинстве приложений с графическим интерфейсом, но если вы действительно хотите, чтобы приложение командной строки дожидалось завершения отправленного кода, это сделает работу.


Кстати, знаете ли вы, что sleepForTimeInterval использует секунды, а не миллисекунды? Возможно, вы намеревались использовать 0,7 секунды, а не 700 секунд?

1 голос
/ 03 ноября 2019

При условии, что " main " означает функцию запуска main(), а код, который вы показываете, представляет собой все тело main() тогда:

Как только main()возвращает приложение прекращено. Так что в вашем случае block1 может начинать или не начинать выполнение, но приложение быстро завершает свою работу, независимо от того.

Скопируйте ваши строки в методы applicationDidFinishLaunching: (macOS) или application:didFinishLaunchingWithOptions: (iOS) стандартного приложения с графическим интерфейсоми затем запустите это. Приложение с графическим интерфейсом в виде цикла выполнения, которое поддерживает его работу до тех пор, пока какое-либо событие не завершит работу приложения, поэтому ваше приложение будет работать достаточно долго для выполнения block1 (вы можете изменить 700 на «1015» для теста илиВы будете ждать его долго).

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...