【发布时间】:2020-05-28 07:57:16
【问题描述】:
我已经为 Firestore 中的每个文档保存了包含一些虚拟数据和纬度/经度的商店列表。我想在 poi 附近获取文件。为此,我使用了 GeoFire 库。 现在,我可以对 geoQuery.addGeoQueryEventListener() 方法内部的数据进行排序,但此方法不是阻塞操作,因此我的代码在 geoQuery.addGeoQueryEventListener() 可以返回排序列表之前退出。下面是代码sn-p:
List<QueryDocumentSnapshot> doc = new ArrayList<>();
List<String> businessIds = new ArrayList<>();
Set<Business> businessSet = new HashSet<>();
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), 2000);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
// TODO Auto-generated method stub
businessIds.add(key);
}
@Override
public void onKeyExited(String key) {
// TODO Auto-generated method stub
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
// TODO Auto-generated method stub
}
@Override
public void onGeoQueryReady() {
// TODO Auto-generated method stub
System.out.println("All initial data has been loaded and events have been fired!");
}
@Override
public void onGeoQueryError(DatabaseError error) {
// TODO Auto-generated method stub
System.err.println("There was an error with this query: " + error);
}
});
geoQuery.removeAllListeners();
ApiFuture<QuerySnapshot> query = firestore.collection("business").whereIn("businessId", businessIds).get();
businessSet = query.get().getDocuments().stream()
.map(b -> b.toObject(Business.class)).collect(Collectors.toSet());
return businessSet;
在上面的代码中,我的程序在 onKeyEntered() 中可以添加到 businessIds 之前退出。
【问题讨论】:
-
你不能让你的firestore查询在回调中运行吗?不过,您可能必须返回一个异步类型,例如 CompletableFuture,但非阻塞 IO 通常是一件好事(除非您每个请求都有一个线程,那么这就不成问题了)。
-
等等,
query.get()也在阻塞,不是吗?我不知道这个 API,但它看起来确实像一个阻塞操作。 -
是的,query.get() 是一个阻塞操作,但它取决于非阻塞的 geoQuery.addGeoQueryEventListener() 的结果。 query.get() 不返回结果,因为它的前导没有及时获取数据。
标签: java google-cloud-firestore firebase-admin geofire geofirex