У меня есть приложение, которое общается с ExternalAccessory по Bluetooth, есть некоторая задержка в ответах, поэтому я хочу, чтобы IO произошел в фоновом потоке.Как использовать NSRunLoop для NSOperationQueue?
настроить соединение NSOperationQueue для однопоточных операций епдиеего моих запросов:
self.sessionQueue = [NSOperationQueue new];
self.sessionQueue.maxConcurrentOperationCount = 1;
Если я планировать операции чтения и запись в EAAccessory
потоки из этой очереди, мои приложение аварий, так как данные из сокета не могут доставляться без NSRunLoop
в потоке, который использует очередь. Сразу после инициализации очереди, создать цикл выполнения с пустой NSMachPort
, чтобы сохранить это работает и запустить его:
[self.sessionQueue addOperationWithBlock:^{
NSRunLoop* queueLoop = [NSRunLoop currentRunLoop];
[queueLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
[queueLoop run]; // <- this blocks
}];
Это блокирует очередь как цикл выполнения никогда не будет выход, но я не знаю, как правильно управлять циклом запуска, чтобы я мог успешно читать из дополнительных потоков.
«Если цикл запуска запущен, потому что вы хотите получить уведомление или аналогичные обязательства API, тогда вам нужно быть осторожным. Вы не можете просто исключить работу этого цикла и заставить все работать. аналогичным образом не просто переместить весь код потока в NSOperation (с запущенным циклом запуска) и бросить его в очередь операций, а блок NSOperation, выполняющий цикл выполнения, не является разумным использованием NSOperationQueues ». -https: //lists.apple.com/archives/cocoa-dev/2009/Sep/msg01145.html – alfwatt
Пример: https://horseshoe7.wordpress.com/2015/04/29/nsoperation-and-nsrunloop- a-marriage-of-need/ – alfwatt