我有NSArray
包含多个ID。在Firebase
中是否有一种方法可以使用数组中的id获取所有对象?
我正在建立一个餐厅评级应用程序,使用GeoFire
来检索附近的餐馆。我的问题是GeoFire
只返回附近的餐馆ID列表。有什么方法可以使用ID查询所有对象吗?
答案 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)
})
}