Swift и Firebase: получение данных о местоположении из Firebase для отображения на карте Google.

Я делаю приложение, которое собирает информацию о ресторанах от пользователей в виде журналов и показывает собранные рестораны в зависимости от местоположения, если их запрашивает другой пользователь. Часть регистрации сделана. Приложение может получать входные данные (фотографии, комментарии, оценки и т. д.) о ресторане от пользователя, получать данные о местоположении с карт Google и сохранять все эти данные в Firebase. Таким образом, долгота/широта каждого ресторана будет сохранена в Firebase. Теперь проблема заключается в том, что другим пользователям по запросу показываются близлежащие рестораны. У меня есть часть Google Maps SDK, но отправка запроса в Firebase, чтобы найти ближайший ресторан (ы), работает не так хорошо.

locationsRef.queryOrderedByChild("longitude").queryStartingAtValue(locationManager.location!.coordinate.longitude-1).queryEndingAtValue (locationManager.location!.coordinate.longitude+0.01).observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in

//This part searches for restaurants within 0.01 degrees in longitude

            locationsRef.queryOrderedbyChild("latitude").queryStartingAtValue(locationManager.location!.coordinate.latitude-1).queryEndingAtValue(locationManager.location!.coordinate.latitude+0.01).observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in

// This part does the same for latitude (0.01 degrees is around 1km)

            // Add name label UILabel here
            self.eateryNameLabel.text = name

            // Add address label UILabel here
            self.eateryAddressLabel.text = address

            var names = [String]()
            var addresses = [String]()
            var longs = [Double]()
            var lats = [Double]()

            for _ in snapshot.children {
                var name = snapshot.value!["eateryname"] as! String
                names.append(name)

                var address = snapshot.value!["address"] as! String
                addresses.append(address)

                var long = snapshot.value!["longitude"] as! Double
                longs.append(long)

                var lat = snapshort.value!["latutide"] as! Double
                lats.append(lat)
            }

Итак, это то, что я пытался сделать, но я не могу запустить его, потому что у меня пока нет хорошего понимания извлечения данных из Firebase. 'ObserveEventType(.ChildAdded') также вызывает ошибку двусмысленности. Это самый простой способ сделать это? Я пропустил какие-то важные строки?


person sofarsophie    schedule 21.07.2016    source источник


Ответы (2)


Мне нужно посмотреть, как вы храните его в Firebase (как он выглядит в БД на firebase)... если у вас возникли проблемы с получением данных из firebase, просто напечатайте () весь снимок или все, что вы хотите отладить, и рано или поздно вы найдете правильный ответ...

Я использую это для аналогичного извлечения данных... просто примечание. ChildAdded имеет встроенный цикл For in Loop.

         ref.child(user.uid).child("/markers").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
            let objName = snapshot.key
            print("key: \(objName)")
            let tit = snapshot.value!["title"] as! String
            let snip = snapshot.value!["snip"] as! String
            let lat = snapshot.value!["lat"] as! Double
            let long = snapshot.value!["long"] as! Double

            let marker = GMSMarker()
            marker.title = tit
            marker.snippet = snip
            marker.position = CLLocationCoordinate2DMake(lat, long)
            marker.map = self.mapView

        })
person Mazel Tov    schedule 21.07.2016
comment
Вот такой список ресторанов: рестораны: {1: {название забегаловки: -, адрес: -, долгота: -, широта: -}, 2: {...}, 3: {...}}, - person sofarsophie; 21.07.2016
comment
Тогда является ли хорошим подходом выстраивание двух запросов подряд (для сортировки данных с использованием 2 факторов, долготы и широты)? - person sofarsophie; 21.07.2016
comment
Вы уверены, что получите какие-то результаты от этого запроса? Я бы попробовал что-то подобное, хотя github.com/firebase/geofire, но это может не работать с Firebase 3... Я думал, у вас проблемы с получением данных... - person Mazel Tov; 21.07.2016

Вы можете попробовать .observeSingleEventOfType(FIRDataEventType.Value, ... для этого

Обратите внимание, что он не имеет встроенного цикла и не отслеживает изменения в БД. Вы просто получаете данные, которые вам нужны и все

person Dima Rostopira    schedule 21.07.2016
comment
Привет, спасибо за ответ. Но я все еще получаю, что тип выражения неоднозначен без дополнительной ошибки контекста, когда я использую '(.Value'. Есть ли способ решить эту проблему? Какую дополнительную информацию мне нужно предоставить? - person sofarsophie; 22.07.2016
comment
@SeHyunPark Это функция Swift с ошибками. Точка без чего-либо перед означает, что параметр перечисляется. Если вы используете Swift 3, вы должны использовать .value, если он все еще не работает, также укажите тип перечисления FIRDataEventType.Value - person Dima Rostopira; 22.07.2016