Во-первых, не блокируйте основную резьбу. Никогда не. Блокировка основного потока достаточно долго на iOS приведет к тому, что ваше приложение будет убито. На OS X это вызовет появление радужной пиццы смерти.
В конечном счете, блокировка основной нити приводит к тому, что ваше приложение не отвечает на запросы.
Вместо этого попросите приложение выставить модальный диалог или модальный лист или какой-либо другой индикатор состояния, который указывает, что приложение делает что-то, что необходимо сделать до того, как прогресс будет продолжен. Убедитесь, что элемент меню «выйти» все еще включен, если пользователь решает «о, дерьмо! Нет времени для этого! Abort! Abort! Abort!».
Затем, когда ваша фоновая нить завершена, используйте любой из различных механизмов для отправки в основной поток (GCD, performSelector: ... и т. Д.), Что затем приводит к исчезновению «инициализирующей» модальности.
Не нужно опроса, спать или пока() {} вообще.
Мой фоновый поток не будет сделано, он живет более или менее навсегда. И мне нужно, чтобы он достиг определенного состояния, прежде чем главная нить может это сделать. вещь.
Точно; так, когда он достигает этого состояния, вы можете использовать:
[someObject performSelectorOnMainThread:@selector(sshConnectionEstablished:) withObject:nil];
Где someObject
может, вероятно, будет ваше приложение делегата.
Или вы могли бы использовать уведомление и сделать что-то вроде:
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationNamed:@"MySSHConnectionEstablished" ....];
});
Обратите внимания, что хотите ли вы это, чтобы быть асинхронными или синхронизацией до вас.
Вы пробовали что-нибудь или знаете, как это сделать на другом языке? – zneak
У меня было некоторое время() с usleep() в нем, но это не оптимально. Должен быть вызов API, который я могу использовать, чтобы разбудить родительский поток, как только он мне понадобится. – ruipacheco
Runloop, семафор или группа. См. Http://stackoverflow.com/q/818674/412916 – Jano