Невозможно правильно наблюдать за Firebase после запроса GeoFire - PullRequest
4 голосов
/ 21 июня 2019

У меня есть функция, которая показывает контакты в MKMapView на основе текущего местоположения пользователя. Эта функция использует GFQuery от GeoFire:

// Allows the user to scroll on the map and have the parties update
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    let loc = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)

    showPartiesOnMap(location: loc)

}

Как видно из фрагмента кода, эта функция неоднократно вызывает функцию showParties на карте (при каждом обновлении местоположения). Эта функция выглядит следующим образом:

func showPartiesOnMap(location:CLLocation) {
    circleQuery = geoFire?.query(at: location, withRadius: 2.5)

    // Observe whenever we find a sighting. If there are 50 parties, this will be called 50 times
    partyObserve = circleQuery?.observe(GFEventType.keyEntered, with: { (key, location) in

        if let location = location, let key = key {

            let anno: PartyAnnotation


            self.fullPartyName = key

            // Attempting to print just the name of the party and not the time
            var characters = Array(key.characters)

            var currentChar: Character = " "
            var finalName: String = ""
            var dateString: String = ""
            var finalDate: Date? = nil


            // Gets the name of the party
            currentChar = characters.remove(at: 0)
            while currentChar != "*" {

                finalName += "\(currentChar)"
                currentChar = characters.remove(at: 0)
            }

            // Gets the date the party was created
            currentChar = characters.remove(at: 0)
            while currentChar != "*" {
                dateString += "\(currentChar)"
                currentChar = characters.remove(at: 0)
            }

            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
            finalDate = dateFormatter.date(from: dateString)!

            // Check if the party should still exist
            if(self.shouldBeDeleted(partyDate: finalDate!)) {
                self.geoFire.removeKey(key)
            }
            else if characters.count > 0 {
                // The party in question is public
            }
            else {
                // Created an annotation because the party should not be deleted
                anno = PartyAnnotation(coordinate: location.coordinate, partyName: finalName)

                self.mapView.addAnnotation(anno)

            }

        }

    })

}

Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь покидает эту страницу, я больше не могу правильно наблюдать за чем-либо в Firebase. Для любых будущих наблюдений (не GeoFire) я получаю неожиданно найденный ноль, разворачивая необязательное значение.

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

partyObserve = circleQuery?.observe(GFEventType.keyEntered, with: { (key, location) in

Если я прокомментирую это наблюдение, проблема не произойдет. К сожалению, мне нужна эта функциональность, поэтому комментирование не является жизнеспособным решением. Я попытался удалить AllObservers и удалить наблюдения с помощью Firebase Handles. Кто-нибудь знает, почему это может происходить или возможное решение?

Заранее спасибо за помощь!

...