我正在使用Firebase的Firestore为我的iOS应用程序存储数据。在Firestore,我有两个收藏。一个叫songs
一个叫playlists
。songs
集合包含许多文档,每个文档中都有一个歌曲信息。下面是songs
文档的外观。
然后,在我的收藏playlists
中,它包含一些作为播放列表的文档。下面是一个playlists
文档的示例。
我希望能够显示一个播放列表,然后从我的songs
收藏中获取该播放列表中的歌曲标题。所以,我做到了:
var testPlaylistTitles = [String]()
db.collection("playlists").whereField("title", isEqualTo: "Test Playlist").getDocuments { (snapshot, error) in
for document in (snapshot?.documents)! {
self.testPlaylistTitles = ((document.data()["songTitles"] as? [String])!)
}
}
这使得变量
testPlaylistTitles
=["Test Song", "Test Song 2", "Test Song 3"]
。那太好了。但这就是问题所在。我想从我的songs
收藏中获取这些歌曲的信息。因此,我创建了一个for循环并循环遍历歌曲,以附加到其他艺术家、图像和标题数组中。就在这个例子中,我将使用一个变量returedTitles
。var testPlaylistTitles = [String]()
db.collection("playlists").whereField("title", isEqualTo: "Test Playlist").getDocuments { (snapshot, error) in
for document in (snapshot?.documents)! {
testPlaylistTitles = ((document.data()["songTitles"] as? [String])!)
}
var returedTitles = [String]()
for i in 0...testPlaylistTitles.count-1 {
db.collection("songs").whereField("title", isEqualTo: testPlaylistTitles[i]).getDocuments(completion: { (snapshot, error) in
for document in (snapshot?.documents)! {
returedTitles.append((document.data()["title"] as? String)!)
}
})
}
}
现在,
returedTitles
等于原始testPlaylistTitles
的无序版本。起初我以为它是按字母顺序排序的,但事实并非如此。有人知道发生了什么以及如何修复它吗!谢谢!这件事困扰了我一段时间。 最佳答案
我不知道如何在swift中执行此操作,但我会将playlist文档中歌曲的数据结构更改为一个对象,其中歌曲是键并按顺序排列值,然后在查询的第二个循环中,使用键返回值,您应该能够按值排序。
{
description: "test",
songs: {
"Test Song 1": 1,
"Test Song 2": 3,
"Test Song 4": 2
},
title: "Test playlist"
}
我还建议您使用列表中歌曲的ID,因为您将在稍后的阶段检索数据。
关于swift - Firebase Firestore弄乱了阵列的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49119482/