Для целей этого вопроса предположим, что мне нужно запустить некоторую функцию для какого-либо объекта, и эта функция займет много времени (минут).Также предположим, что я не контролирую эту функцию (*). Как мне теперь отменить выполнение этой функции?
Я хочу запустить его в фоновом потоке, чтобы освободить основной поток, и я мог бы сделать это с GCD, NSOperation
или NSThread
.Однако, насколько я знаю, ни одна из этих поддержек не заставила остановиться.Все они могут быть отменены, но эта отмена должна быть реализована в самой функции - но у меня нет доступа к этой функции, поэтому я не могу этого сделать.Самое близкое, что я получил, это использование NSThread
и exit()
, но, к сожалению, его нельзя применить к переменной экземпляра (см. Пример кода).Мой текущий план состоит в том, чтобы попытаться отправить уведомление и заметить, что внутри объекта / функции и уничтожить поток изнутри, используя Thread.exit()
.Мне просто интересно, есть ли «более чистый» или более простой способ, встроенный или сторонний.
let someObject = Object()
// Using GCD
dispatchQueue.async { someObject.expensiveFunction() }
// Using NSOperation
operationQueue.addOperation { someObject.expensiveFunction() }
// Using NSThread
let thread = Thread { someObject.expensiveFunction() }
thread.exit() // exit is not available on an instance
(*) В этом случае у меня есть контроль над функцией и я могу реализоватьфактическая отмена, но из-за библиотек, которые я использую, это потребует большого количества рефакторинга.