【问题标题】:How to receive array data in the same order [closed]如何以相同的顺序接收数组数据[关闭]
【发布时间】:2019-12-10 09:43:25
【问题描述】:

我的应用要求用户每天对 1-6 的值进行评分。 我为每个用户将它存储在一个文档中, 我想创建一个简单的图表视图并在 x 轴上显示用户率。

我的问题是:

当我从文档中获取值时,它会以随机方式返回值,每次我打开应用程序时。

在我附在下面的照片中,您可以看到代码和它返回的数组。

代码

结果

【问题讨论】:

  • 首先欢迎来到 Stackoverflow。请不要张贴图片。发文。请求的结果似乎是一个字典。字典是无序的。您需要应用谓词以将已排序的内容或 sort values 返回到您需要的顺序。
  • 您的数据最初是如何保存的?看起来它被保存为未排序的字典。保存时可以使用排序类型吗?例如数组,元组...?否则,您可以在加载后使用 .sorted() 方法对字典进行排序,该方法返回一个元组。您可以查看这篇文章以了解更多信息:stackoverflow.com/questions/25377177/sort-dictionary-by-keys
  • 将您的代码发布为代码,而不是图像。在 Xcode 中突出显示您的代码,在 Xcode 中使用 command+c,在 StackOverflow 编辑器中使用 command+v,突出显示代码,然后按 command+k 将其格式化为代码。

标签: arrays swift firebase


【解决方案1】:

一般来说,Firebase / Firestore 非常依赖键值对,就像在字典中找到的那样。

字典是无序的......所以这个

document?.data()

包含您的数据,但它没有排序,并且会因读取而异。

保证顺序的一种选择是将值存储在数组中。

我不知道您的 Firestore 结构是什么,但假设我们有一个文档,其中包含多个包含数组的字段

arrays // collection
   array_doc_0 //document
      array_0    /field
         0: 1
         1: 2
         2: 3
      array_1
         0: 4
         1: 5
         2: 6

要阅读这些内容并将它们打印到控制台,代码如下。请注意,数组的内容将始终按正确的顺序排列,由它们的数组索引保证。

func readSomeArrays() {
    let arraysCollection = self.db.collection("arrays")
    let thisArrayDoc = arraysCollection.document("array_doc_0")
    thisArrayDoc.getDocument(completion: { documentSnapshot, error in
        if let err = error {
            print(err.localizedDescription)
            return
        }

        guard let doc = documentSnapshot?.data() else { return }

        for arrayField in doc {
            let array = arrayField.value as! [Int]
            for i in array {
                print(i)
            }
        }
    })
}

和输出

[4, 5, 6]
[1, 2, 3]

请注意,array_1 在 array_0 之前打印。这是因为 documentSnapshot.data() 是一个无序的“字典”,我们正在对其进行迭代。不清楚排序是否重要,但如果重要,请将数组存储在数组中,或创建自己的索引并在代码中排序。

【讨论】:

    【解决方案2】:

    在您的示例中,您可以在阅读之前在data array 中使用sort
    如:

    data.sort()

    来自 Apple 的示例:

    var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
    students.sort()
    print(students)
    // Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
    

    来源:https://developer.apple.com/documentation/swift/array/1688499-sort

    【讨论】:

    • 如果他们不想对它们进行排序 - 他们希望按照它们在 Firebase 中的存储顺序读取它们怎么办?
    • 在这种情况下,您将不得不重新考虑应用程序的架构,因为正如@vadian 在评论中提到的那样:“请求的结果似乎是一个字典。字典是无序的。你需要应用一个谓词来返回一些排序或排序值到你需要的顺序”。
    • 如何知道数据是如何存储的?如果它已经存储在一个数组中(这是有序的)怎么办?我的观点是 OP 显然希望按存储顺序而不是排序顺序检索数据。如果周一评分为 3,周二评分为 2,周三评分为 5,然后这些评分按照您的答案排序,它们将不再对应正确的日期。
    • 哦,现在知道了。是的,这是有道理的。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2021-04-20
    • 2016-02-18
    • 2022-08-18
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多