NSTimer запускается только один раз после аннулирования и повторной инициализации - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующая функция setPath(), которая вызывается всякий раз, когда пользователь нажимает на кнопку:

var loadSuccessfulTimer: Timer? = nil
func setPath(index: Int) {

    self.loadSuccessfulTimer?.invalidate()
    self.loadSuccessfulTimer = nil

    print("setting path")

    self.pause(releaseAudioSession: false)

    self.reset(index: index)
    let song = DataManager.getInstance().getQueueSong(index: index)
    superpowered.setPath(song.url, true)


    self.loadSuccessfulTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(checkLoadSucess), userInfo: nil, repeats: true)
    self.loadSuccessfulTimer!.fire()
}

@objc func checkLoadSucess() {
    let status = self.superpowered.getLoadSuccessful()
    print(status)
    if(status != -1) {
        self.loadSuccessfulTimer?.invalidate()
        self.loadSuccessfulTimer = nil

        if(status == 1){
            print("success")
        } else if(status == 2){
            print("failed")
        }
    }
}

Таким образом, всякий раз, когда вызывается функция setPath(), я хочу, чтобы таймер срабатывал каждые 0.2 секунд для проверки значения status = self.superpowered.getLoadSuccessful(). Переменная status будет иметь значения -1, 1, 2 Я хочу остановить таймер, когда он либо 1, либо 2. Однако происходит следующий сценарий:

При первом нажатии он работает как положено и печатает следующее:

setting path
-1
-1
-1
-1
-1
-1
1
success

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

setting path
-1

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

Update

Второй раз setPath() вызывается с DispatchQueue.global(), возможно, это связано с проблемой.

1 Ответ

0 голосов
/ 26 июня 2018

NSTimer требует запуска цикла для правильной работы. В главной очереди есть цикл выполнения бесплатно, для других очередей необходимо убедиться, что цикл выполнения доступен.

Обязательно прочитайте документацию: https://developer.apple.com/documentation/foundation/nstimer

Кроме того, не забудьте аннулировать объект NSTimer из того же цикла выполнения (потока), который был создан (запланирован) из.

...