google-cloud-firestore - 使用 AVKit 和 Swift 播放预下载的音频文件
问题描述
在我的应用程序中,我在单个视图中有一个简短的音频文件列表。我想下载预下载音频列表中的前 3 个项目,以便用户无需等待下载音频。下载音频文件列表中的前三个项目并在这些文件之间提供无缝事务的好方法是什么?
数据存储在 Firebase 存储中,并使用以下代码获取:
@Published var fons = [Fon]()
init(fonId: String) {
fetchData(fonId: fonId)
}
func fetchData(fonId: String) {
Firestore.firestore().collection("fons").document(fonId).collection("fons").getDocuments { (snap, err) in
if let err = err {
print(err.localizedDescription)
return
}
guard let documents = snap?.documents else { return }
for doc in documents {
let docData = doc.data()
let id = docData["id"] as? String ?? "error"
let audioURL = docData["audioURL"] as? String ?? "error"
let storage = Storage.storage().reference(forURL: audioURL)
storage.downloadURL { (url, err) in
if let err = err {
print(err.localizedDescription)
return
}
self.fons.append(Fon(audioURL: audioURL, id: id))
}
}
}
之后,单击列表中的项目后,我将使用以下代码播放声音。项目列表以用户最有可能单击列表中前三个项目的方式呈现,这就是为什么我想预下载这些音频文件,即使没有进入特定视图。目前,我在结构中定义了 AVPlayer:
@State var player = AVPlayer()
我通过从列表中传入 URL 来使用以下函数播放音频。
func playAudio(url: String) {
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
}
catch {
print(error)
}
player = AVPlayer(playerItem: AVPlayerItem(url: URL(string: url)!))
player.play()
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
}
有什么好方法可以让这个过程更有效率?我考虑下载列表中的前三个项目,以创造一种更同步的感觉。
解决方案
推荐阅读
- c++ - 顺时针旋转二维数组
- javascript - ThreeJS 与 OrbitControls 和动画有关的问题
- matlab - 使用 cellfun 将 scatter3 应用于单元阵列的每个单元
- php - 尽管使用了缓存,但数据加载时间相同
- python-2.7 - 如何在用户提供的列数中打印列表列表?
- rust - 如何根据用户代理使用 Iron/Router 以不同方式路由请求?
- python - 如果注释行与我的 input.txt 文件与 python 位于同一行代码中,则注释行不会被转义
- xmpp - ejabberd 跨域聊天用户
- sql - 存储数据范围的颜色并在 SQL Server 中的 case 语句中使用
- latex - Doxygen & (La)Tex - 使用参数标签时无法创建 PDF