Я со ссылкой на этот SO пост в течение нескольких дней в настоящее время: Filtering results with Geofire + FirebaseMultiple Geofire запросы и на стороне клиента фильтрации
Моя проблема заключается в том, что для моего приложения IOS мне нужно сделать один список близлежащих пользователей который упорядочен по учетным данным, например: член премии (наивысший и верхний список), даритель (следующий самый высокий после премии), член (базовый/самый низкий).
Я создал 3 записи на моем сервере Firebase для местоположений GeoFire, которые разделяют пользователей на основе этих учетных данных, и поэтому им нужно запустить 3 запроса для их получения.
GeoFire* geoFirePremium = [[GeoFire alloc] initWithFirebaseRef:[[[FIRDatabase database] reference] child:@"geofire-premium-members"]];
GeoFire* geoFireDonator = [[GeoFire alloc] initWithFirebaseRef:[[[FIRDatabase database] reference] child:@"geofire-donator-members"]];
GeoFire* geoFireRegular = [[GeoFire alloc] initWithFirebaseRef:[[[FIRDatabase database] reference] child:@"geofire-regular-members"]];
NSMutableDictionary* query1Items = [[NSMutableDictionary alloc] init];
NSMutableDictionary* query2Items = [[NSMutableDictionary alloc] init];
NSMutableDictionary* query3Items = [[NSMutableDictionary alloc] init];
CLLocation* coord = [[CLLocation alloc] initWithLatitude:34.2499 longitude:-85.4399]; // Test location
long searchDistance = 8;
float mile2Kilo = 1.60934;
float kilo2mile = 0.62137;
GFCircleQuery* query1 = [geoFirePremium queryAtLocation:coord withRadius:(CGFloat)(searchDistance * mile2Kilo)]; // Miles to Kilometers
[query1 observeEventType:GFEventTypeKeyEntered withBlock:^(NSString* key, CLLocation* location)
{
// Store results in query1Items
}];
GFCircleQuery* query2 = [geoFireDonator queryAtLocation:coord withRadius:(CGFloat)(searchDistance * mile2Kilo)];
[query2 observeEventType:GFEventTypeKeyEntered withBlock:^(NSString* key, CLLocation* location)
{
// Store results in query2Items
}];
GFCircleQuery* query3 = [geoFireRegular queryAtLocation:coord withRadius:(CGFloat)(searchDistance * mile2Kilo)];
[query3 observeEventType:GFEventTypeKeyEntered withBlock:^(NSString* key, CLLocation* location)
{
// Store results in query3Items
}];
Мои мысли добавить некоторый код, который распознает, когда все 3 запросы завершена, а затем объединяет их в 1 список.
NSMutableDictionary* mergedItems = [[NSMutableDictionary alloc] init];
// For example: { query1Items[], query2Items[], query3Items[], ... }
[query1 observeReadyWithBlock:^{
NSLog(@"Query 1 is finished");
// Check for queries 2 & 3 completion
// Perform merge if all are completed
}];
[query2 observeReadyWithBlock:^{
NSLog(@"Query 2 is finished");
// Check for queries 1 & 3 completion
// Perform merge if all are completed
}];
[query3 observeReadyWithBlock:^{
NSLog(@"Query 3 is finished");
// Check for queries 1 & 2 completion
// Perform merge if all are completed
}];
Если структура JSON для всех ссылок Firebase/GeoFire следующим образом:
- geofire-premium-members
- userid
- g: geohash
- l
- 0: lat
- 1: lon
- geofire-donator-members //same format
- geofire-regular-members //same format
- users
- userid
- …
Это хороший подход использовать несколько запросов, как это? Возможно, мне может понадобиться добавить дополнительные учетные данные в будущем и не знаю, будет ли мой подход хорошо масштабироваться. Возможно, лучший способ добиться того, что мне нужно, возможно, вместо этого используется только один запрос? Я очень признателен за любую проницательность
Большинство из нас легче разбирать код, чем анализировать слова, описывающие этот код. Если у вас есть сомнения относительно структуры вашего текущего кода, поделитесь минимальным кодом, который воспроизводит эти проблемы. Если вы затем добавите фрагмент структуры JSON (как текст, без скриншотов), вы, скорее всего, получите полезный ответ. –
@FrankvanPuffelen спасибо, я обновил с соответствующим кодом – codeflow