2017-06-06 349 views

回答

1

你需要得到的productosPopulares數組,然後獲得每個對象。

let referenceToProductosPopulares = FIRDatabase.database().reference(withPath: "productosPopulares") 

referenceToProductosPopulares.observeSingleEvent(of: .value, with: { snapshot in 
     if let value = snapshot.value as? NSDictionary { 
      let productosPopIds = value.allKeys as! [String] 
      // get every object  
      for id in productosPopIds { 
       let refToProd = FIRDatabase.database().reference(withPath: "productos").child(id) 
       refToProd.observeSingleEvent(of: .value, with: { snapshot in 
        // your value 
       }) 
      } 
     } else { 
      print("productosPopulares") 
     } 
    }) 

不完美的代碼。應該做更多的功能。但這是主意。

希望它有幫助

+0

這個答案不如我的效率高。您首先要下載受歡迎產品的密鑰,然後對每個產品提出單獨的請求,這是不好的。 – Callam

+0

@Callam在你的情況下用10000個對象服務器端會檢查每個對象。這不是有效的。在我的情況下,它會下載只有必要的對象的完整數據。他有一系列Id。他只需要下載帶有這個ID的項目。 –

+0

@Callam我認爲最好的方式取決於古斯塔沃的完整邏輯。將來他可以用最好的方式來解決他的問題。無論如何。問題是「如何查詢另一個孩子的孩子」。這是我的答案。你根本不用這個數組。我的回答對這個問題更好。可能(可能,我們無法證明它)更好的方式爲所有情況將是你的:) –

1

您可以通過esPopular孩子查詢訂購,只返回等於true的孩子。

let ref = Database.database().reference(withPath: "productos") 
let query = ref.queryOrdered(byChild: "esPopular").queryEqual(toValue: true) 

query.observe(.childAdded, with: { (snapshot) in 
    print(snapshot) 
}) { (error) in 
    print(error) 
} 
+0

在這種情況下,您將下載每個對象,然後搜索,我記得。這不是一個好方法 –

+0

@VladPulichev在這種情況下,客戶端不會下載每個對象。查詢不會發生在客戶端,因此客戶端只會將「esPopular」等於true的孩子下載。 – Callam

+0

好吧,沒關係,它會做服務器,但是,我寫錯了。你不會下載所有的數據。但服務器端會在服務器端做同樣的事情。例如,100000個對象服務器將檢查每個項目。這不是有效的。 –

相關問題