Нет способа остановить или «убить» DispatchWorkItem
или NSOperation
извне. Существует метод cancel()
, но он просто устанавливает для свойства isCancelled
элемента или операции значение true. Это не останавливает выполнение самого элемента. Так как recv
блокирует, нет возможности проверить флаг isCancelled
во время выполнения. Это означает, что ответ, опубликованный Vadian, к сожалению, ничего не сделает.
Согласно Apple Docs на NSOperation.cancel
:
Этот метод не заставляет ваш код операции останавливаться.
То же самое относится к NSOperationQueue.cancelAllOperations
:
Отмена операций не приводит к автоматическому удалению их из очереди или остановке тех, которые выполняются в данный момент.
Вы можете подумать, что можно использовать необработанный NSThread
. Однако тот же принцип применяется и здесь. Вы не можете детерминистически уничтожить поток извне.
Возможное решение: время ожидания
Лучшее решение, которое я могу придумать, это использовать функцию тайм-аута сокета. Я не знаю, откуда берется UDPServer
, но, возможно, у него есть встроенное время ожидания.
Возможное решение: Тайм-аут плохого человека (отправка пакета на локальный хост)
Другой вариант, который вы можете попробовать, это отправить себе UDP-пакеты по истечении определенного времени. Таким образом, recv
получит некоторые данные, и выполнение будет продолжено. Это может быть использовано как «тайм-аут бедняка».