#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()
Комментариев нет:
Отправить комментарий