Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

swift 3: NSTimer

#ios #swift


Использую этот код для проигрывания аудио. Проблема в том, что из-за этой строчки
RunLoop.main.add(timer!, forMode: .commonModes) устройство сильно греется. Как это
исправить?

Полный код:

@IBAction func playAudio(sender: AnyObject) {
    if !audioPlayer.isPlaying{
        audioPlayer.play()
        slider.maximumValue = Float(audioPlayer.duration)
        slider.value = 0.0
        timer = Timer(timeInterval: 0.0, target: self, selector: #selector(self.updateTime),
userInfo: nil, repeats: true)
        RunLoop.main.add(timer!, forMode: .commonModes)
    } else {
        audioPlayer.pause()
        playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal)
        timer?.invalidate()
    }
}

func updateTime() {
let currentTime = Int(audioPlayer.currentTime)
let minutes = currentTime/60
let seconds = currentTime - minutes * 60
timeElapsed.text = NSString(format: "%02d:%02d", minutes,seconds) as String
}

    


Ответы

Ответ 1



Жарко ему от этой строчки? :) Или вы все-таки будете хоть немного конкретизировать возникающие проблемы, наверно нагрузка на процессор высокая, от того и нагрев? Код тоже анализируйте, интервал 0.0 это практически while (true) {} что нагрузит одно из ядер процессора почти на 100%.

Ответ 2



можно также использовать в Swift не NSTimer a GСD-шный и более Swift-style вариант где то в вашем классе объявите свойство var timer:DispatchSourceTimer? если стартуете новую мелодию, переинициализируйте его timer = DispatchSource.makeTimerSource() timer?.scheduleRepeating(deadline: .now(), interval: .seconds(1) ) timer?.setEventHandler { DispatchQueue.main.async { // ваш код для обновления времени проигрывания на UI } } в обработчике кнопки Play/Stop если хотите запустить timer?.resume() если остановить совсем timer?.cancel() если поставить на паузу timer?.suspend()

Комментариев нет:

Отправить комментарий