Я уже несколько дней ссылаюсь на этот пост SO: Фильтрация результатов с помощью Geofire + Firebase< /а>
Моя проблема заключается в том, что для моего приложения 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
- …
Это хороший подход к использованию нескольких запросов, подобных этому? Возможно, в будущем мне потребуется добавить больше учетных данных, и я не знаю, будет ли мой подход хорошо масштабироваться. Возможно, есть лучший способ добиться того, что мне нужно, который вместо этого может использовать только один запрос? Я очень ценю любое понимание