Получение пользователей и ключей запроса Geofire занимает много времени с Firebase

Я новичок в работе с GeoFire и RXJS.

Мне нужно отображать ближайших пользователей на основе запроса Geofire. Я пробовал много способов, но это заняло много времени, около 9 сегментов (всего 5-6 тестовых пользователей). Как мне его оптимизировать?

Спасибо за помощь в продвижении

В базе

-locations
  - userID
      - g
      - l
        - 0:lat
        - 1:long

- users
  -userID
   - firstname: "fname"
   - lastname...

Сервис Geofire

hits = new BehaviorSubject ([]);

   getNearLocations(radius: number, coords: Array<number>) {
this.geoFire.query({
  center: coords,
  radius: radius
})
.on('key_entered', (key, location, distance) => {
  let hit = {
    key: key,
    location: location,
    distance: distance,
  }

  let currentHits = this.hits.value
  //this.hits.push(hit)
  currentHits.push(hit)
  this.hits.next(currentHits)
})

people.ts (Конструктор)

this.locateActiveUser().then((pos) => {
  this.geofire.getNearLocations(2, [pos.coords.latitude, pos.coords.longitud])

  this.subscription = this.geofire.hits  
  .subscribe( nearUserArray => {
    Promise.all(
      nearUserArray.map(nearUser => {              
        this.afDatabase.object(`users/${nearUser.key}`).query.once('value')
        .then( user => {
          nearUser["user"]= user.val(); })        
          return nearUser
    })).then( a => {
      console.log("nearUserArray: ", nearUserArray);
      this.nearbyUsers$ = of(nearUserArray);
    })   

  }) 

}) 

people.html

  <ion-item *ngFor="let nearby of nearbyUsers$ | async" class="item item-block item-md">
        <ion-row>
          <ion-col col-3 >...
          </ion-col>
          <ion-col col-9 (click)="navigateTo('user-profile', nearby.user)">
              <ion-row>
                  <ion-col col-4 >
                    <span>A {{nearby.distance | roundNumber }} km</span>
                  </ion-col>
              </ion-row>
              <ion-row>
                <h3> {{nearby.user.firstname}} {{nearby.user["lastname"]}}</h3>
              </ion-row>                      
          </ion-col>    
        </ion-row>
      </ion-item>

Консоль браузера

введите здесь описание изображения


person Mastech    schedule 28.07.2018    source источник
comment
Наконец то я понял! Я добавляю вызов firebase после каждого введенного ключа и добавляю данные каждого пользователя в тему поведения. Кроме того, я перемещаю getNearLocations на вкладку по умолчанию в приложении (первое представление после регистрации). Затем я просто преобразовал значение субъекта поведения в наблюдаемое в People.ts. Вот и все!   -  person Mastech    schedule 01.08.2018


Ответы (1)


Поэтому я скажу, что вы, вероятно, делаете лучшее, что могли .geofire больше похож на индекс, который вы можете получить ссылки на фактические документы / объекты в вашем Firebase RTDB. Существуют библиотеки для Firestore, такие как geofirestore (мой личный ребенок), а также _ 3_, которые позволяют сделать только один запрос в зависимости от местоположения и получить документ.

geofirestore больше похож на geofire в том, что касается того, как все работает под капотом, и может быть проще перейти на (если вам было интересно).

person MichaelSolati    schedule 30.07.2018