I'm trying to get a geohash query with coroutines async
override suspend fun getUsersWithGeoHash(
latitude: Double,
longitude: Double,
radiusInMeter: Int
): List<UserEntity> {
val center = GeoLocation(latitude, longitude)
val bounds = GeoFireUtils.getGeoHashQueryBounds(center, radiusInMeter.toDouble())
val tasks : MutableList<Task<QuerySnapshot>> = mutableListOf()
val boundSize : Int = bounds.size
var docs = mutableListOf<DocumentSnapshot>()
var userList = mutableListOf<UserEntity>()
bounds.forEach {
geoQueryBounds ->
val query = fireStore.collection("database/user/userList")
.orderBy("geohash")
.startAt(geoQueryBounds.startHash)
.endAt(geoQueryBounds.endHash)
tasks.add(query.get())
}
Log.d("user-get", "before->"+ tasks.size)
Log.d("user-get", "before->"+ docs.size)
var deferred : Deferred<Task<List<Task<*>>>> = CoroutineScope(Dispatchers.IO).async {
Tasks.whenAllComplete(tasks)
.addOnCompleteListener {
Log.d("user-get", "on-0-> addOnComplete")
tasks.forEach { task ->
val snapshot = task.result
Log.d("user-get", "on->"+ task.toString())
snapshot.documents.forEach {
docs.add(it)
}
}
}
}
Log.d("user-get", "after ->"+ docs.size)
val result = deferred.await()
Log.d("user-get", "result -> "+ result.toString())
Log.d("user-get", "after ->"+ docs.size)
docs.forEach {
documentSnapshot ->
val user = documentSnapshot.toObject(UserEntity::class.java)
if (user != null) {
userList.add(user)
}
}
return userList
}
this is code I created. but 'userList' has no any user ...
I expected this log.d order
before - > 3
before - > 0
on-0-> addOnComplete
on->com.google.android.gms.tasks.zzw@539056a
on->com.google.android.gms.tasks.zzw@2e9ca5b
on->com.google.android.gms.tasks.zzw@69512f8
after ->0
result -> com.google.android.gms.tasks.zzw@a0897cc
after ->0
user-getwithhash: size -> 0 (this is at viewmodel)
how can I implement that function like above??