【问题标题】:How to refresh Swift UIViewController from Delegate callback如何从委托回调刷新 Swift UIViewController
【发布时间】: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

标签: swift uiviewcontroller


【解决方案1】:

您可能需要在 UI 线程中调用 playSong 才能正确刷新。

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    // Increment currentSongIndex

    DispatchQueue.main.async
    {
        playSong()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多