iOS - как получить уведомление, когда поток (использующий GCD) завершает свою работу - PullRequest
1 голос
/ 16 августа 2011

Я начинаю использовать GCD, и мне нужно знать, когда определенный поток завершил свою работу.

Мой код:

dispatch_queue_t registerDeviceQueue = dispatch_queue_create("RegisterDevice", NULL);
dispatch_async(registerDeviceQueue, ^{
    [self registerDevice];

    dispatch_async(dispatch_get_main_queue(), ^{
        [aiRegisterDevice stopAnimating];
    });
});
dispatch_release(registerDeviceQueue);

Мне нужно знать, когда закончился этот шаг, чтобы UIActivityView мог остановиться. Как сейчас, так и останавливается до окончания потока.

Спасибо

RL

1 Ответ

6 голосов
/ 18 августа 2011

Я бы создал группу и использовал dispatch_group_wait для продолжения только после завершения вычислений. Чтобы взять ваш пример:

dispatch_queue_t registerDeviceQueue = dispatch_queue_create("RegisterDevice", NULL);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, registerDeviceQueue, ^{
    [self registerDevice];
});

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // Block until we're ready
// Now we're good to call it:
[aiRegisterDevice stopAnimating];

dispatch_release(registerDeviceQueue);
dispatch_release(group);

Или, если вы хотите предотвратить блокировку обратного вызова, используйте dispatch_group_notify:

dispatch_queue_t registerDeviceQueue = dispatch_queue_create("RegisterDevice", NULL);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, registerDeviceQueue, ^{
    [self registerDevice];
}); // In this version, the group won't block


// This block gets called asynchronously when the above code is done:
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    [aiRegisterDevice stopAnimating];
});

dispatch_release(registerDeviceQueue);
dispatch_release(group);
...