【问题标题】:How to append data to array properly? Swift4如何正确地将数据附加到数组?斯威夫特4
【发布时间】:2019-03-23 05:42:17
【问题描述】:

我一直在尝试从 firebase 检索一些数据并将其存储在数组中。但是当我尝试追加数据时遇到了问题。

我只能在闭包内和闭包外将数据存储到数组中,我突然丢失了数组内的所有值。为什么会这样?请帮我找出我缺少的东西......

        var names = [String]()
        var txts = [String]()
        var imgUrls = [String]()

Database.database().reference().child("Posts").child("dummy").observe(.value) { (snapshot) in
                guard let snapshots = snapshot.children.allObjects as? [DataSnapshot] else {
                    return
                }
                for snap in snapshots {
                    let autoId = snap.key as String
                    Database.database().reference().child("Posts").child("dummy").child(autoId).observe(.value, with: { (snapshot) in
                        guard let data = snapshot.value as? [String: Any] else {return}

                        //name
                        guard let name =  data["name"] as? String else {return}
                        self.names.append(name)
                        //image
                        guard let imgUrl = data["image"] as? String else {return}
                        self.imgUrls.append(imgUrl)
                        //txt
                        guard let txt = data["text"] as? String else {return}
                        self.txts.append(txt)

                        print(self.names) //this returns all data from firebase
                        print(self.imgUrls) //this returns all data from firebase
                        print(self.txts) //this returns all data from firebase
      }
                        print(self.names) //this returns empty array
                        print(self.imgUrls) //this returns empty array
                        print(self.txts) //this returns empty array
    }

【问题讨论】:

  • 您错过了闭包是异步的这一事实。寻找“Swift + Closure + Async”。此外,不要使用 3 个数组,只使用一个带有自定义结构的数组,该结构将包含 imageUrlnametext 属性。这三个信息是同步的,它们没有别的意义。如果删除self.names 数组的一项,则需要对另外两项执行相同的操作,对吗?如果你想洗牌怎么办?使用一个数组。
  • 如果保护语句无法忍受 for 循环,我对您的使用有一条评论。在您的情况下,如果在快照中检测到 nil 值时出错,您将退出该方法而不迭代其他剩余的快照。我认为如果让更适合。或者简单地将 return 替换为 continue 以便您的 forloop 可以继续下一个对象。

标签: arrays swift firebase firebase-realtime-database


【解决方案1】:

可能是因为您在闭包内分配数据,这可能会在以后发生。所以基本上最后一个打印语句出现在闭包语句之前。

我会推荐你​​使用 didSet 来理解序列。例如:

var names: [String] = [String]() { 
    didSet {
      print(names)  // this is print each time the value is set
    }
}
var txts: [String] = [String]() {
   didSet {
    print(txts)
   }
}
var imgUrls: [String] = [String]() {
   didSet {
       print(imgUrls)
   }
}

Database.database().reference().child("Posts").child("dummy").observe(.value) { (snapshot) in 
     guard let snapshots = snapshot.children.allObjects as? [DataSnapshot] else { return }

  for snap in snapshots {
                let autoId = snap.key as String
                Database.database().reference().child("Posts").child("dummy").child(autoId).observe(.value, with: { (snapshot) in
                    guard let data = snapshot.value as? [String: Any] else {return}

                    //name
                    guard let name =  data["name"] as? String else {return}
                    self.names.append(name)
                    //image
                    guard let imgUrl = data["image"] as? String else {return}
                    self.imgUrls.append(imgUrl)
                    //txt
                    guard let txt = data["text"] as? String else {return}
                    self.txts.append(txt)
}



}

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 2020-07-31
    • 2021-07-05
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多