Получить все объекты в пределах определенного диапазона в GeoFire

Можно ли получить все ключи в определенном диапазоне, используя GeoFire от Firebase? Я знаю, что вы можете получать события для гео-запросов, например: ввод ключа, выход ключа или перемещение ключа, однако в настоящее время я ищу что-то более похожее на FEventTypeValue (однократное чтение значения для определенного географического региона), потому что мои объекты карты не двигаются.

Ничего не могу найти в документации: https://github.com/firebase/geofire-objc


person Michael    schedule 09.03.2015    source источник
comment
Если ваш объект не движется, вы получите ровно одно событие ввода ключа для каждой записи. Вы можете отслеживать [query observeWithReadyBlock..., чтобы узнать, когда все события загружены, а затем использовать removeObserverWithHandle, чтобы прекратить прослушивание.   -  person Kato    schedule 09.03.2015


Ответы (2)


Вы можете использовать события ввода ключа, чтобы сначала сохранить все ключи для запроса в словаре, а затем использовать событие готовности, чтобы определить, когда все ключи были добавлены:

NSMutableDictionary *allKeys = [NSMutableDictionary dictionary];
[query observeEventType:GFEventTypeKeyEntered withBlock:^(NSString *key, CLLocation *location) {
    [allKeys setObject:location forKey:key];
}];
[query observeReadyWithBlock:^{
    // Create an immutable copy of the keys in the query
    NSDictionary *valueData = [allKeys copy];
    NSLog(@"All keys within a query: %@", valueData);
}];

Не забудьте после этого очистить слушателей.

person jonnydee    schedule 09.03.2015
comment
Вот как это сделать. Для будущих читателей: обратите внимание, что при создании ключа в методе вы должны выбрать какой-то значимый и уникальный идентификатор: [geofire setLocation:forKey:I_E_FIREBASE_UNIQUE_ID] Сохраните объекты geofire в одном узле в вашем дереве, например: geofireSth, и создайте индекс на G-узел geofireSth. Таким образом, вы сможете использовать запрос из примера @johnnydee для получения объектов в определенном радиусе. Используйте ключ, полученный из запроса (I_E_FIREBASE_UNIQUE_ID), чтобы выполнить запрос сервера на получение дополнительных данных об объекте. - person Michael; 10.03.2015

Разве это не именно то, что вы ищете?

GeoFire позволяет запрашивать все ключи в пределах географической области, используя объекты GFQuery.

Цель-C:

  CLLocation *center = [[CLLocation alloc] initWithLatitude:37.7832889 longitude:-122.4056973];
    // Query locations at [37.7832889, -122.4056973] with a radius of 600 meters
    GFCircleQuery *circleQuery = [geoFire queryAtLocation:center withRadius:0.6];

    // Query location by region
    MKCoordinateSpan span = MKCoordinateSpanMake(0.001, 0.001);
    MKCoordinateRegion region = MKCoordinateRegionMake(center.coordinate, span);
    GFRegionQuery *regionQuery = [geoFire queryWithRegion:region];

Свифт:

let center = CLLocation(latitude: 37.7832889, longitude: -122.4056973)
// Query locations at [37.7832889, -122.4056973] with a radius of 600 meters
var circleQuery = geoFire.queryAtLocation(center, withRadius: 0.6)

// Query location by region
let span = MKCoordinateSpanMake(0.001, 0.001)
let region = MKCoordinateRegionMake(center.coordinate, span)
var regionQuery = geoFire.queryWithRegion(region)
person LoVo    schedule 09.03.2015
comment
Ну, я так и думал, однако я мог что-то упустить, но я не вижу способа получить доступ к списку объектов, которые были найдены в определенном регионе. - person Michael; 09.03.2015
comment
Я не могу проверить это прямо сейчас, но разве все результаты не должны быть в объекте circleQuery? - person LoVo; 09.03.2015
comment
Согласно документам, списка или чего-то подобного нет: geofire-ios .firebaseapp.com/docs/Classes/GFCircleQuery.html Мы можем наблюдать завершение запроса, но атрибуты блока недействительны, в отличие от FEventTypeValue в Firebase. - person Michael; 09.03.2015