2017-01-18 8 views
0

Я со ссылкой на этот 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 
     - … 

Это хороший подход использовать несколько запросов, как это? Возможно, мне может понадобиться добавить дополнительные учетные данные в будущем и не знаю, будет ли мой подход хорошо масштабироваться. Возможно, лучший способ добиться того, что мне нужно, возможно, вместо этого используется только один запрос? Я очень признателен за любую проницательность

+0

Большинство из нас легче разбирать код, чем анализировать слова, описывающие этот код. Если у вас есть сомнения относительно структуры вашего текущего кода, поделитесь минимальным кодом, который воспроизводит эти проблемы. Если вы затем добавите фрагмент структуры JSON (как текст, без скриншотов), вы, скорее всего, получите полезный ответ. –

+0

@FrankvanPuffelen спасибо, я обновил с соответствующим кодом – codeflow

ответ

0

Нет ничего плохого в вашей концепции. Это может быть сложным, хотя есть три запроса для возврата одного и того же типа данных и объединения данных в код и выполнения дополнительных запросов для получения других пользовательских данных.

т.е. трех запросов в коде возврата кучу пользовательских идентификаторов, к которому затем нужно сделать несколько запросов, чтобы (например) посмотреть отдельные имена пользователей

Пока все члены в пользователи узла имеют ту же структуру, можно просто поместить их в один узел и использовать свойство ребенка, чтобы указать, какой пользователь они

userid_0 
    name: "some name" 
    user_type: "regular" 
userid_1 
    name: "another name" 
    user_type: "donator" 

Затем запрос GeoFire вернуть всех пользователей в пределах указанного радиуса.

Предполагая, что пользователи должны искать свое имя (в качестве примера) в любом случае, вы оставите остальную часть данных в пользовательском узле и сможете просто их прочитать, сортировать по user_type (в коде) и отображать ,

Если вы точно знаете, как вы хотите, чтобы они отсортировались, то простое изменение структуры позволит это легко.

userid_0 
    name: "some premium name" 
    user_type: 0 
userid_1 
    name: "a donator name" 
    user_type: 1 
user_id_2 
    name: "regular name" 
    user_type: 2 

где 0 = премиум пользователь, 1 = пользователь-донор, а 2 - обычный пользователь.

Затем, при сортировке кода, сортировка по user_type и надбавки будут всплывать вверх.

+0

Я вижу, где этот тип структуры полезен, но в большинстве случаев я получаю как минимум 1000 результатов. Я бы хотел избежать сортировки на стороне клиента любой ценой.Множество запросов, похоже, обойти эту проблему. – codeflow

+0

Результаты @codeflow 1000 будут небольшим количеством данных, поэтому там не так много. Кроме того, сортировка 1000 результатов не займет много вычислительной мощности - что, как говорится, зачем сортировать по коду? Firebase может сортировать для вас в запросе, когда он извлекает данные, если вы предпочитаете. Что вы хотите отсортировать? Кроме того, вы можете легко выполнить несколько запросов в этой структуре, если хотите, чтобы это направление было направлено. Идея состоит в том, что он денормализован, расширяем и обслуживаем, и в коде можно легко подходить. – Jay

+0

Спасибо @Jay Я не знал, что могу сортировать запрос GeoFire с использованием Firebase? Я действительно не видел, как это сделать. И по состоянию на данный момент он не был легко доступен в коде, хотя мои данные были довольно денормализированы. Я бы сказал, что – codeflow

 Смежные вопросы

  • Нет связанных вопросов^_^