Я пишу приложение, которое должно взаимодействовать с устройством, подключенным через USB. Приложение отправляет и получает данные по очереди от устройства в фиксированное время. Все Rx / Tx происходит в отдельном потоке, потому что в противном случае пользовательский интерфейс был бы заблокирован. Основная структура выглядит в основном так. (автозапуск бассейнов и прочее пропущено)
-(void)comThread:(id)arg {
while(state == kIsConnected) {
// let timers run
[runLoop runUntilDate:[NSDate distantFuture]];
// handle data
if(rxTxState == kRx) {
// do some stuff to pass data to upper layers
rxTxState = kTx;
}
if(rxTxState == kTx) {
// do some stuff to send data
rxTimeoutTimer = [NSTimer scheduledTimer....];
}
}
}
После отправки данных приложение ожидает либо получения данных, либо запуска rxTimeoutTimer
, что приводит к повторной передаче пакета. Операция rx работает, так как нижележащие слои используют системные вызовы async и вызывают обработчик rx, который выглядит в основном так.
-(void)receiveData:(NSData*)data{
[rxQueue addObject:data];
[rxTimeoutTimer invalidate]; // cancel timeout
}
Есть ли (простой) способ сделать [runLoop runUntilDate:]
выход из receiveData:
? Документы Apple говорят, что удаление всех источников таймера не гарантирует выхода из RunLoop. Я что-то читал о звонке performSelector:onThread:...
, но он либо не работал, либо я не понял смысла.
Спасибо.