Google cloud firestore 使用AVKit和Swift播放预下载的音频文件
在我的应用程序中,我有一个单一视图中的短音频文件列表。我想下载预下载音频列表中的前3项,这样用户就不用等待音频下载了。下载音频文件列表中的前三项并在这些文件之间提供无缝事务的好方法是什么 数据存储在Firebase存储器中,并使用以下代码获取:Google cloud firestore 使用AVKit和Swift播放预下载的音频文件,google-cloud-firestore,swiftui,avfoundation,firebase-storage,avkit,Google Cloud Firestore,Swiftui,Avfoundation,Firebase Storage,Avkit,在我的应用程序中,我有一个单一视图中的短音频文件列表。我想下载预下载音频列表中的前3项,这样用户就不用等待音频下载了。下载音频文件列表中的前三项并在这些文件之间提供无缝事务的好方法是什么 数据存储在Firebase存储器中,并使用以下代码获取: @Published var fons = [Fon]() init(fonId: String) { fetchData(fonId: fonId) } func fetchData(fonId: String) { Firesto
@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)
}
让这个过程更有效率的好方法是什么?我考虑下载列表中的前三项,以创造一种更加并行的感觉