Я создаю приложение, которое отображает спортивные мероприятия на карте вокруг текущего местоположения пользователя.
Спортивные мероприятия хранятся в базе данных Firebase. Существует более 15 тысяч мероприятий.
Для этого я использую Firebase и Geofire в проекте Xamarin.Forms: я использую два пакета nuget: FirebaseAuthentication.net и FireSharp.
У меня нет проблем с аутентификацией.
Но я довольно ограничен в FireSharp: он использует REST API Firebase и не оптимизирован для гео-запросов, как GeoFire.
Это GeoFire: https://github.com/firebase/geofire-java
А это FireSharp: https://github.com/ziyasal/FireSharp
Например, с GeoFire запросить «все спортивные мероприятия вокруг широты / долготы» довольно просто (это пример нативного Android):
// creates a new query around [37.7832, -122.4056] with a radius of 0.6 kilometers
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(37.7832, -122.4056), 0.6);
И он возвращает все соответствующие действия за 300 мсек, используя 1 Http-запрос.
С FireSharp, чтобы сделать это, мне нужно:
1: запрос объектов GeoFire с широтой и "Geo Hash":
//Build the query
QueryBuilder query = QueryBuilder.New().OrderBy("g").StartAt(geohash1).EndAt(geohash2);
//Send the Http query with FireSharp
var response = await Instance.m_firebaseActivitieApp.GetAsync("activites_locations", query);
//Deserialize the response from server and construct the list of GeoFire objects
var results = JsonConvert.DeserializeObject<IDictionary<string, GeofireObject>>(response.Body);
foreach (var item in results)
GeoActivities.Add(new GeoFireActivity() { IdActivity = item.Key, GeoActivity = item.Value });
2: просмотрите возвращенные объекты GeoFire и сделайте запрос Http для каждого из них, чтобы получить полный соответствующий объект:
//Browse every GeoFire objects
foreach (var GeoAct in GeoActivities)
{
//Send a Http request with FireSharp to get the sport activity object
var response = await Instance.m_firebaseActivitieApp.GetAsync(WebUtility.UrlEncode("activites/" + GeoAct.IdActivity);
//Deserialize the result from the server and construct the sport activity object
Activite res = JsonConvert.DeserializeObject<Activite>(response.Body);
}
И это в течение 200 мс для первого запроса и 800 мс для каждого запроса активности, потому что в базе данных Firebase более 15 000 действий.
Чтобы загрузить 40 действий, мне нужно подождать 35 секунд ... Это не приемлемо для моего приложения.
Я хотел бы знать, есть ли способ использовать GeoFire в моем проекте Xamarin.Forms? Я пытался создать Binding Library, но это не сработало. Библиотека привязки скомпилирована, но я не могу создать экземпляр объекта GeoFire в моем приложении Xamarin.Forms.
GeoFire доступен на Java для Android, Objective C / Swift для iOS, JavaScript для веб-сайтов ... Есть ли шанс получить его в C # для Xamarin? (https://github.com/firebase/geofire)
Пожалуйста, помогите! : -)