【问题标题】:Appending array in swift values mixed up在 swift 值中附加数组混淆了
【发布时间】:2021-02-18 10:47:48
【问题描述】:

我正在尝试从 Firestore 数据库中获取数据,如下所示:

texts - 1 - message (String)
            author (String)
      - 2 - message (String)
            author (String)
      ...

出于测试目的,我将消息字符串设置为“test”+它们包含的数字(例如 1 将是 test1)

我用来在堆栈视图中将这些显示为标签的代码是:

if startNumOfMessages > 0 {
    let g = DispatchGroup()
    for message in stride(from: startNumOfMessages, through: 1, by: -1) {
        g.enter()
        print(message)
        db.collection("chats").document(self.userDefaults.string(forKey: "currentGroup")!).collection("texts").document("\(message)").getDocument { (doc, err) in
            if err != nil{
                print("Error getting message \(message)")
            }
            else{
                if doc!.exists{
                    let messData = doc!.data()
                    messageArray.append(messData!["message"] as! String)
                    authorArray.append(messData!["author"] as! String)
                }
                else{
                    print("Document Doesnt exist")
                }
            }
            g.leave()
        }
    }
    //Display them
    g.notify(queue: .main){
        print(messageArray)
        for num in stride(from: messageArray.count - 1, through: 0, by: -1){
            let authorLabel = UILabel()
            authorLabel.text = authorArray[num]
            authorLabel.font = UIFont(name:"SF Pro", size: 10.0)
            authorLabel.textColor = UIColor.lightGray
            self.stackView.addArrangedSubview(authorLabel)
            let label = UILabel()
            label.text = messageArray[num]
            self.stackView.addArrangedSubview(label)
        }
    }
}

但是,当我 print(messageArray) 时,数组显示为

["test1", "test3", "test2", "test4", "test5"]

所以我的问题是为什么会发生这种情况?我试过弄乱循环,但它们看起来很好,我检查了它获取的数据,那里没有任何不正确的地方。

【问题讨论】:

  • 如果您在getDocument 的闭包中打印消息并将它们附加到数组中,它们的顺序是否正确? Order and limit data 的文档说:默认情况下,查询会按文档 ID 升序检索满足查询的所有文档,您需要使用 order(by:,来实际对数据进行排序。
  • 它们的顺序不正确,这让我感到困惑,它与最终数组的顺序相同,这意味着什么吗?
  • 但是它们每次都以同样的混乱顺序出现

标签: ios arrays swift


【解决方案1】:

我的猜测是不能保证 getDocument 完成闭包的调用顺序与调用 getDocument 的顺序相同。例如。一个可能来自本地缓存,另一个来自网络,因此可能会被重新排序。

【讨论】:

  • 这是个好主意,我会研究一下,它与 Swapnil 所说的有关
【解决方案2】:

编辑 2:

抱歉,您不需要order(by:

我再次检查了您问题中的代码,我在答案中写的所有内容似乎都无关紧要。由于您使用 document("\(message)")texts 集合中检索,其中 message 实际上是计数,唯一的解释是您的数据必须不正确。即您必须在编号为 2 的对象中设置 test3,反之亦然。

验证这一点的简单方法是在代码之前/之后添加以下打印语句以将文本附加到您的messageArray

if let messageString = messData?["message"] as? String {
    print("text #: \(message) - message: \(messageString)")
}

旧答案(留在这里仅供参考)

正如我在Order and limit data with Cloud Firestore 的评论中提到的那样,明确提到了:

默认情况下,查询会按文档 ID 升序检索满足查询的所有文档。您可以使用 orderBy() 指定数据的排序顺序

意思是,您期望的数据排序顺序(通过消息文本或输入数据的顺序)不是默认/保证的。

只需使用.order(by: "message") 即可按您需要的顺序获取数据。

编辑:

您需要对集合应用排序。 所以,而不是:

.collection("texts")

你需要使用:

.collection("texts").order(by: "message")

【讨论】:

  • 虽然doc!.data() 不存在并且我找不到获取数据的函数,但我如何从那里获取数据
  • 我将排序添加到集合中但我无法获取数据,问题的关键是正确获取数据
  • 您是否能够在排序之前获取数据(即使顺序错误)?没有什么可以仅仅因为order(by:而改变。
  • 顺序覆盖之后的命令,所以我不能做collection.order.getDocument
  • 你能分享你用来设置数据的代码吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2017-09-20
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多