Вы не должны выполнять IO в главном потоке, ваша потребность в обработке цикла выполнения очевидна. Циклы выполнения сложны, особенно потому, что многие события не приводят к завершению вызова runloop, как ожидалось (все, что выполняется по таймеру для одного, выполнение селекторов просто выполняется по таймеру) . Возможно, вы могли бы решить свою проблему, не ожидая distantFuture
, а всего лишь несколько сотен миллисекунд за раз.
Что вы действительно хотите сделать, так это запустить my_connect()
в фоновом потоке и просто подождать условия. Этот код будет намного легче обрабатывать, он будет выглядеть как менее взломанный и на самом деле будет работать лучше.
Вы можете использовать экземпляр NSConditionLock
для реализации ожидания. Это не супер очевидно, как это сделать. Но вы можете создать общий экземпляр в NSConditionLock
в переменной condLock
следующим образом:
condLock = [[NSConditionLock alloc] initWithCondition:0];
И тогда вы бы реализовали ожидание в my_connect()
:
[condLock lockWhenCondition:1];
// Add code that needs to be thread safe here if you like.
[condLock unlockWithCondition:0];
И вот как вы должны сообщить NSConditionLock
, что пришло время продолжить с вашего метода делегата.
[condLock lock];
// More thread safe code here if you like
[condLock unlockWithCondition:1];
Вы можете назначить некоторые константы для использования вместо 0
и 1
в явном виде и получить довольно хорошее решение.