Невозможно остановить DispatchQueue.global (). Асинхронную задачу на swift - PullRequest
0 голосов
/ 04 марта 2019

Я выполняю бесконечный цикл, чтобы вибрировать мой телефон внутри асинхронной задачи dispatchQueue.global (). As, чтобы мой пользовательский интерфейс не зависал, но проблема в том, что я не смог его остановить.ниже мой код

var queue: DispatchWorkItem?

queue = DispatchWorkItem {
            while (self.l > 1)
            {
                AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }

        DispatchQueue.global().async(execute: queue!)

и ниже код, где я пытаюсь остановить его, когда пользователи покидают экран

override func viewWillDisappear(_ animated: Bool) {
        queue?.cancel()
        l=0
        DispatchQueue.global().async {
            self.queue?.cancel()
        }
        print("view will disapear")
    }

перепробовал почти все, но все равно не смог остановитьглобальная диспетчерская задача.PS: я новичок в разработке iOS:)

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

На самом деле var queue: DispatchWorkItem? является DispatchWorkItem и может быть отменено, если еще не выполнено.Поэтому, если вы убедитесь, что DispatchQueue.global().async(execute: queue!) позвоните после viewWillDisappear, ваш код должен работать как положено.

0 голосов
/ 07 марта 2019

Проблема устранена, фактически не следовало использовать глобальную асинхронную диспетчеризацию.Попытка сделать это с таймером, и он работал, вибрируя после каждой секунды и не останавливает пользовательский интерфейс, также легко останавливается после простого вызова timer.invalidate ().Спасибо за помощь, ребята:)

0 голосов
/ 04 марта 2019

GCD (Grand Central Dispatch) Очереди не могут быть остановлены.Если вы хотите остановить асинхронные очереди, вы должны использовать NSOperationQueue, у которого есть опция pause, resume, cancel для задачи в очереди.

Из вашего кода вы можете попробовать еще одну вещь, чтобы остановить его, так как вы используете бесконечный цикл для вибрации.Здесь, в цикле, вы можете добавить некоторое условие, чтобы больше не вибрировать.

...