2017-06-06 166 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个对象服务器将检查每个项目。这不是有效的。 –