Как использовать таймер, чтобы остановить длительную функцию?Swift 4 - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть функция, которая работает в течение длительного времени, и я хотел бы дать ей ограничение 10 секунд, если это возможно.Я также хотел бы реализовать кнопку Cancel, чтобы пользователь также мог ее нажимать.

Я попытался просто проверить состояние переменной abort во время ее вычисления, но она просто продолжает работать.Я не очень разбираюсь в Grand Central Dispatch и timers и не знаю, куда идти.

...



var abort = false

@objc func abortCalculations() {
    abort = true
}


func calculate() {
    abort = false

    let _ = Timer(timeInterval: 10, target: self, selector: #selector(abortCalculations), userInfo: nil, repeats: false)



    dispatchGroup.enter()
    DispatchQueue.global(qos: .userInteractive).async {
        while !abort {
            x += 1 // for example, just something that repeats
                    // when this actually finishes, it leaves the dispatch group
        }
    }
}



...

Я бы хотел, чтобы функция calculate() завершилась, когда таймеростанавливает его (или когда пользователь нажимает кнопку в будущем).Вместо этого он продолжает работать, и функция abortCalculations() никогда не вызывается.

1 Ответ

0 голосов
/ 11 февраля 2019

Вместо использования Timer вы можете использовать аналогичный DispatchQueue для установки флага отмены.

var abortFlagItem = DispatchWorkItem(block: {
    self.abort = true
})
DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: abortFlagItem)

В любой момент, если вы хотите отменить, вы можете позвонить abortFlagItem.cancel()

...