Опрос против КВО / NSNotification / Делегат - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть инструмент на Mac, который имеет интерфейс обработки данных, веб-интерфейс и пользовательский интерфейс.Эти три интерфейса работают в трех различных последовательных (асинхронных) dispatch_queues. (Пользовательский интерфейс запускается в главной очереди)

Мой интерфейс обработки данных должен остановиться, когда веб-интерфейс получает команду Стоп.Обработка данных dispatch_block не имеет каких-либо зависимостей, за исключением того, что она должна прослушивать команду Stop из веб-интерфейса.

Меня смущает вопрос о том, как мне спроектировать блок данных, чтобы мне не приходилось опрашивать веб-интерфейс, чтобы убедиться, что он получил команду Stop.Стек для моего блока данных довольно глубокий (много вызовов функций), и я не хочу проверять каждую функцию, если Stop был вызван.Цель состоит в том, чтобы как можно скорее остановиться, когда я получу команду Stop .

Я не могу положиться на isCancelled метод NSOperationBlock, поскольку мой блок данных всегда работает, пока не получит Стоп.

Моя цель здесь не в том, чтобы спроектировать интерфейсы влучше, но быстро выйти из блока данных, когда я получаю команду Stop .

Я знаю, что это давняя проблема того, как избегать постоянной проверки переменной.Просто было интересно, есть ли что-нибудь, что можно было бы сделать.

Все предложения приветствуются.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете просто убить блок обработки данных.Это может привести к утечке памяти и нестабильному состоянию.Подход isCancelled NSNSOperation - лучший путь.Команда Stop должна установить переменную, которая является локальной для блока обработки данных, и внутри блока вы проверяете эту переменную в удобных местах и ​​очищаете и выходите, когда она установлена.

...