【发布时间】:2018-06-25 21:50:44
【问题描述】:
我是菜鸟。我有一些编程经验,但不熟悉 Swift 4 和 Xcode 9.2。
我一直在学习教程和阅读。我已经实现了许多音乐播放器示例之一。我已将其扩展为显示歌曲元数据。这很好用。
我已经实现了 AVAudioPlayerDelegate audioPlayerDidFinishPlaying() 函数。在这个函数中,我抓取下一首歌曲的元数据,设置视图变量,然后播放歌曲。歌曲播放,但旧歌曲元数据仍然存在。
如何使用我的新元数据刷新视图?
对于这么简单的问题,我提前道歉。我已经广泛搜索答案,要么不理解,要么似乎不适用。善良,我又老又脆弱。
import UIKit
import AVFoundation
class SecondViewController: UIViewController, AVAudioPlayerDelegate {
@IBOutlet weak var currentSongArtwork: UIImageView!
@IBOutlet weak var currentSongTitle: UILabel!
var audioPlayer = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
playSong()
}
func playSong() {
extractSongMetaData()
currentSongTitle.text = extractedSongTitle
currentSongArtwork = extractedSongArtwork
let audioPath = Bundle.main.path(forResource: songs[currentSongIndex], ofType: ".m4a")
try audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
audioPlayer.delegate = self
audioPlayer.play()
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
// Increment currentSongIndex
playSong()
}
}
【问题讨论】:
-
尝试在您的 audioPlayerDidFinishPlaying DispatchQueue.main.async { playong() } 中执行此操作
-
extractSongMetadata函数有什么作用?如果您是异步提取元数据,那么在调用以下两行代码时,新数据将不会被加载。 -
stackoverflow 的新手。如果这不是回答我的帖子的问题的正确区域,请告知。 Christian,我添加了您建议的 DispatchQueue 代码。它可以工作,但是非常慢。单击我的 NEXT 按钮时,UI 立即更新,歌曲开始播放。在 audioPlayerDidFinishing() 方法中,歌曲立即开始播放,但在 Xcode 中 UI 需要 50 秒才能更新!供参考。我的机器很强大。
-
Jsdodgers,没有在主线程中提取数据......不是异步的。 'code' let playerItem = AVPlayerItem(url: songURL[currentSongIndex]) let metadataList = playerItem.asset.commonMetadata