2017-08-28 127 views
0

这是我的数据结构。 enter image description here阅读firebase数据

这是我如何加载俱乐部数据及其地址。

func loadClubs() { 

     ref = Database.database().reference() 
     ref.child("club").observe(DataEventType.childAdded, with: { (clubSnapshot) in 
      if let clubDict = clubSnapshot.value as? [String : AnyObject] { 
       let name = clubDict["name"] as! String 
       let explanation = clubDict["explanation"] as! String 
       let courtNum = clubDict["courtNum"] as! Int 
       let membershipFee = clubDict["membershipFee"] as! Int 
       let visitorFee = clubDict["visitorFee"] as! Int 
       let hasCarParking = clubDict["hasCarParking"] as! Bool 
       let club2 = Club2(name: name, explanation: explanation, courtNum: courtNum, membershipFee: membershipFee, visitorFee: visitorFee, hasCarParking: hasCarParking) 
       self.club2Array.append(club2) // Add to clubArray 
       print(self.club2Array) 
       self.tableView.reloadData() 
      } 
      let addressRef = Database.database().reference() 
      addressRef.child("address").child(clubSnapshot.key).observe(DataEventType.childAdded, with: { (addressSnapshot) in 
       if let addressDict = addressSnapshot.value as? [String: AnyObject] { 

        let clubAddress = ClubAddress(postCode: addressDict["postcode"] as! String, cityName: addressDict["city"] as! String, ward: addressDict["ward"] as! String, address1: addressDict["address1"] as! String, address2: addressDict["address2"] as! String) 

        self.addressArray.append(clubAddress) 
        print(self.addressArray) 
       } 
      }) 
     }) 
    } 

基本上,检索俱乐部的每个快照后,我得到俱乐部的钥匙(-KsJB9TkoGNIkiZFGg7),然后使用该密钥来检索地址。 但是,print(self.addressArray)不会打印任何内容。 我在if let addressDict = addressSnapshot.value as? [String: AnyObject] {处添加调试断点,它不会停止调试过程。 为什么不打电话? 我在这里错过了什么?

+0

你打印clubAddress你追加之前。到数组?我认为价值转向为零 –

回答

3

啊!你的代码非常接近。

请记住,.childAdded遍历所有子节点并加载每个子节点。

在你的情况下,你不想遍历所有的地址节点,你只需要一个,并且不想离开观察者。

要做到这一点,我们通过observeSingleEvent(的加载地址节点的特定节点的子数据,:.value的下面是重要组成部分的片段

let addressRef = Database.database().reference() 
addressRef.child("address").child(clubSnapshot.key) 
      .observeSingleEvent(of: .value, with: { (addressSnapshot) in 
    let dict = addressSnapshot.value as! [String: Any] 
    let address = dict["address1"] as! String 
    print(address) 
+0

谢谢。但你的帖子不回答我的问题。print(self.addressArray)不会打印任何东西。我添加一个调试断点,如果让addressDict = addressSnapshot.value作为?[String:AnyObject] {,它不会停止调试过程 – John

+0

它回答了这个问题!let语句失败,因为您不能在这里使用.childAdded观察者,它需要是.value,因此您需要加载子节点s而不是*遍历子节点 - 因为没有任何其他子节点。 – Jay

+0

我只知道是因为我得到了[MyBadminton.Club2,MyBadminton.Club2] - >然后调用self.tableview.reload(),而[MyBadminton.ClubAddress]中只有一个项目。我把self.tableview.reload()解决封闭,我得到它的作品!无论如何,感谢您的帮助。 – John