我正在使用Firebase的Firestore为我的iOS应用程序存储数据。在Firestore,我有两个收藏。一个叫songs一个叫playlistssongs集合包含许多文档,每个文档中都有一个歌曲信息。下面是songs文档的外观。
swift - Firebase Firestore弄乱了阵列的顺序-LMLPHP
然后,在我的收藏playlists中,它包含一些作为播放列表的文档。下面是一个playlists文档的示例。
swift - Firebase Firestore弄乱了阵列的顺序-LMLPHP
我希望能够显示一个播放列表,然后从我的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/

10-11 04:28