首页 > 解决方案 > 如何正确地将数据附加到数组?斯威夫特4

问题描述

我一直在尝试从 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
    }

标签: arraysswiftfirebasefirebase-realtime-database

解决方案


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

我会推荐你​​使用 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)
}



}

推荐阅读