使用ID列表进行Firebase查询(iOS)

时间:2017-04-10 12:30:02

标签: ios swift firebase geofire

我有NSArray包含多个ID。在Firebase中是否有一种方法可以使用数组中的id获取所有对象?

我正在建立一个餐厅评级应用程序,使用GeoFire来检索附近的餐馆。我的问题是GeoFire只返回附近的餐馆ID列表。有什么方法可以使用ID查询所有对象吗?

2 个答案:

答案 0 :(得分:1)

不,您不能像在Firebase中那样进行批量查询。

您需要循环访问您的餐馆ID并使用firebase.initializeApp({ apiKey: apiKey, authDomain: authDomain, databaseURL: databaseURL }); 查询每个ID。例如:

observeSingleEvent

如果您担心性能问题,Firebase 可能能够对所有这些let restaurantIDs: NSArray = ... let db = FIRDatabase.database().reference() for id in restaurantIDs as! [String] { db.child("Restaurants").child(id).observeSingleEvent(of: .value) { (snapshot) in let restaurant = snapshot.value as! [String: Any] // Process restaurant... } } 电话进行分组并将其作为批处理发送到服务器,这可能会回答您原来的问题; - )

答案 1 :(得分:1)

我知道这个答案被认为是可以接受的,但是我使用诺言工具箱并在他的javascript链接Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly上贴上了坦率的方法,我确实取得了很好的成功,并且只想共享快速版本

因此,我有一个附加到帖子的用户ID列表,如下所示: 这些方法也在我的post类中,我可以从firebase中访问帖子ID

// this gets the list of ids for the users to fetch ["userid1", "userid2"....]



func getParticipantsIds() -> Promise<[String]> {

    return Promise { response in
        let participants = ref?.child(self.key!).child("people")
        participants?.observeSingleEvent(of: .value, with: { (snapshot) in
            guard let snapshotIds = snapshot.value as? [String] else {
                response.reject(FirebaseError.noData)
                return
            }
            response.fulfill(snapshotIds)
        })

    }
}




// this is the individual query to fetch the userid


 private func getUserById(id:String) -> Promise<UserData> {
       return Promise { response in

           let userById = dbRef?.child("users").child(id)
           userById?.observeSingleEvent(of: .value, with: { (snapshot) in
               guard let value = snapshot.value else {
                   response.reject(FirebaseError.noData)
                   return
               }
               do {
                   let userData = try FirebaseDecoder().decode(UserData.self, from: value)
                   response.fulfill(userData)
               } catch let error {
                   response.reject(error)
               }
           })

       }
   }


// this is the where the magic happens


func getPostUsers(compeltion: @escaping (_ users:[UserData], _ error:Error?) -> ()){

    getParticipantsIds().thenMap { (id) in
        return self.getUserById(id: id)
    }.done { (users) in
        compeltion(users, nil)
    }.catch({ error in
        compeltion([], error)
    })

}