Использование Geofire в Xamarin.Forms - PullRequest
0 голосов
/ 28 июня 2018

Я создаю приложение, которое отображает спортивные мероприятия на карте вокруг текущего местоположения пользователя.
Спортивные мероприятия хранятся в базе данных 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)

Пожалуйста, помогите! : -)

...