Как получить доступ и отобразить правильную строку из Firestore? - PullRequest
0 голосов
/ 03 сентября 2018

Это мой второй пост в этой замечательной группе, за последние 5 дней я работал над тем, как получить данные из Firestore и сравнить их с моим текущим пользователем location. Кажется, все работает хорошо, за исключением случаев, когда я тестирую свое приложение в режиме реального времени (с моим iPhone). Иногда он показывает правильное место, а иногда он падает или показывает случайное место. Я работаю с методом where() для доступа к данным из моего Firestore, и кажется, что он возвращает то, что мне нужно. Я чувствую, что мое имя в моем документе не работает правильно в тот момент, когда я получаю доступ к информации.

Вот мой код:

Скриншоты Firebase:

Место 1 enter image description here

Место 2 enter image description here

//Creating access to locationManager
var locationManager : CLLocationManager!

@IBOutlet weak var latLabel: UILabel!
@IBOutlet weak var lonLabel: UILabel!
@IBOutlet weak var place: UILabel!
@IBOutlet weak var placeImage: UIImageView!


//Storing the pass data that we got from the firt View

var placeName = String()
var latStore = String()
var lonStore = String()

var lonNumberStore = Double()
var latNumberStore = Double()
var fireLonMax = Double()
var fireLatMax = Double()
var fireLonMin = Double()
var fireLatMin = Double()


override func viewDidLoad() {


    //Here goes some code to display on the SecondViewController
    latLabel.text = latStore
    lonLabel.text = lonStore

    latMaxRead()
    latMinRead()
    lonMaxRead()
    lonMinRead()
}

//This is my button to test if I am in the correct place
@IBAction func updateLocation(_ sender: UIButton) {

    //
    if (fireLatMin...fireLatMax).contains(latNumberStore) && (fireLonMin...fireLonMax).contains(lonNumberStore){
        print("Is good place",fireLonMin,fireLonMax,fireLatMin,fireLatMax)
        place.text = placeName
    } else {
        print("Is not good place", fireLonMin,fireLonMax,fireLatMin,fireLatMax)
        place.text = "Bad"
    }

}

    func latMaxRead() {
    let docRef = Firestore.firestore()
        docRef.collection("places")
            .whereField("latMax", isGreaterThanOrEqualTo: latNumberStore)
            .getDocuments { (snapshot, error) in
                if error != nil {
                    print("Error getting documents: \(String(describing: error))")
                } else {
                    for document in (snapshot?.documents)! {
                        self.fireLatMax = document.data()["latMax"] as! Double
                        //This is where I pull the placeName on my Firebase
                        self.placeName = document.data()["placeName"] as! String 

                        print("Fire latMax:", self.fireLatMax)
                    }
                }
    }

}

func latMinRead() {
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("latMin", isLessThanOrEqualTo: latNumberStore)
        .getDocuments { (snapshot, error) in
            if error != nil {
                print("Error getting documents: \(String(describing: error))")
            } else {
                for document in (snapshot?.documents)! {
                    self.fireLatMin = document.data()["latMin"] as! Double
                    self.placeName = document.data()["placeName"] as! String
                    print("Fire latMin: ", self.fireLatMin)
                }
            }
    }

}

func lonMaxRead() {
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("lonMax", isGreaterThanOrEqualTo: lonNumberStore)
        .getDocuments { (snapshot, error) in
            if error != nil {
                print("Error getting documents: \(String(describing: error))")
            } else {
                for document in (snapshot?.documents)! {
                    self.fireLonMax = document.data()["lonMax"] as! Double
                    self.placeName = document.data()["placeName"] as! String
                    print("Fire lonMax: ", self.fireLonMax)
                }
            }
    }

}

func lonMinRead() {
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("lonMin", isLessThanOrEqualTo: lonNumberStore)
        .getDocuments { (snapshot, error) in
            if error != nil {
                print("Error getting documents: \(String(describing: error))")
            } else {
                for document in (snapshot?.documents)! {
                    self.fireLonMin = document.data()["lonMin"] as! Double
                    self.placeName = document.data()["placeName"] as! String

                    print("Fire lonMin : ", self.fireLonMin)
                }
            }
    }

}

Я чувствую и очень уверен, что делаю что-то не так, либо с моими запросами, либо с моим placeName.

Результаты моей консоли и симулятора:

Результат с моей консоли и моего симулятора

Я думаю, что where() - это метод, который не мешает моему результату, но я не совсем уверен.

1 Ответ

0 голосов
/ 05 сентября 2018

Если вы сравниваете местоположение с некоторым радиусом, в этом случае оно не будет работать. Вы должны использовать Firebase GeoFire вместо.

GeoFire готовится войти FireStore, как только я поговорил с их парнем, но сейчас это невозможно с FireStore. Но вы можете просто поместить данные о своем местоположении в Firebase и после фильтрации местоположения вы можете снова запросить FireStore для получения дополнительных данных.

Вы можете получить некоторую помощь по GeoFire от GeoFire Doc , GeoFire Git и GeoFire Blog .

...