У меня случайный крах, связанный с неправильно обработанной задачей в параллельном потоке, когда приложение переходит к фону.Правильный способ ожидания события из параллельного потока
Так у меня есть 3 темы:
- A (основной).
- B (управляется GCD).
- C (вручную создан для обработки интенсивных операций сокета).
Сценарий следующий:
В applicationDidEnterBackground:
обработчике (который, конечно, выполнен на thread A
) затянувшаяся задача началась thread B
завершить все текущие операции (сохранить состояние приложения, закройте разъем и т. д.). В этой задаче мне нужно подождать, пока сокет правильно завершит свою работу на thread C
и только после этого продолжит эту долговременную задачу.
Ниже упрощен код:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Some synchronous task.
[stateManager saveState];
// Here I need to wait until the socket finishes its task.
...
// Continuing of the long-running task.
...
}
Каков приемлемый способ для выполнения этой задачи. Все в порядке, если я что-то сделаю?
while (socket.isConnected)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
// Continuing of the long-running task.
Или, может быть что-то не так в моей текущей архитектуры, и мне нужно использовать NSOperation
для сериализации асинхронных задач как-то, например?
обновление: Проблема была решена с помощью dispatch_semaphore
APIs как предложено @Rob Napier.
Возможная дубликация [Синхронизация/схема ожидания для передачи сигналов с несколькими потоками (Obj-C)?] (Http://stackoverflow.com/questions/4099801/synchronization-wait-design-for-cross-thread-event-signaling -obj-c) –
Это одно из возможных решений, но @Rob Napier предложил еще один. –