NSRunLoop::runUntilDate блокирует основной поток?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 NSRunLoop::runUntilDate блокирует основной поток?

Сообщение Anonymous »

Я провожу эксперимент на основе этого ответа: https://stackoverflow.com/a/17921058/767653
Это мой минимальный воспроизводимый код:

Код: Выделить всё

- (void)viewDidLoad {
[super viewDidLoad];

__block BOOL completed = NO;
[self doSomethingAsyncAndCompleteOnMainThread:^{
completed = YES;
}];

while (!completed) {
NSLog(@"Wait for 1 sec");
[NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}

NSLog(@"Completed");
}

- (void)doSomethingAsyncAndCompleteOnMainThread:(void(^)(void))completion {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
completion();
});
}
Насколько я понимаю, этот код зашел в тупик. Поскольку блок завершения запускается в основном потоке, для запуска блока завершения необходимо выполнить возврат viewDidLoad. И чтобы viewDidLoad вернулся, необходимо запустить блок завершения, чтобы переключить флаг завершения (следовательно, циклическое ожидание).
Однако, когда я запускаю его, У меня есть распечатка:

Код: Выделить всё

Wait for 1 sec
Wait for 1 sec
Wait for 1 sec
Completed
Это означает, что в этом коде нет взаимоблокировки. Где я неправильно понял?

Подробнее здесь: https://stackoverflow.com/questions/784 ... ain-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»