Остановить выполнение произвольной функции - PullRequest
0 голосов
/ 31 декабря 2018

Для целей этого вопроса предположим, что мне нужно запустить некоторую функцию для какого-либо объекта, и эта функция займет много времени (минут).Также предположим, что я не контролирую эту функцию (*). Как мне теперь отменить выполнение этой функции?

Я хочу запустить его в фоновом потоке, чтобы освободить основной поток, и я мог бы сделать это с 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

(*) В этом случае у меня есть контроль над функцией и я могу реализоватьфактическая отмена, но из-за библиотек, которые я использую, это потребует большого количества рефакторинга.

...