斯威夫特& Firebase:从Firebase检索位置数据以在Google地图标记上显示

时间:2016-07-21 06:57:21

标签: ios swift firebase firebase-realtime-database gmsmapview

我正在创建一个应用程序,它将来自用户的餐馆信息作为日志收集,并根据位置显示收集的餐馆,如果其他用户请求它们。 记录部分已完成。该应用可以收到用户在餐厅的输入(照片,评论,评级等),从谷歌地图接收位置数据,并将所有这些数据保存到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'也导致歧义错误。这是最简单的方法吗?我错过了任何关键的行吗?

2 个答案:

答案 0 :(得分:2)

我必须看看你如何将它存储到Firebase(它在firebase上的数据库中看起来如何)...如果从firebase获取数据时遇到问题只需打印()整个快照或任何你想要调试的内容和迟早你会找到正确的答案......

我正在使用它来进行类似的数据检索...只是一个注释。 ChildAdded 内置For for循环

         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

        })

答案 1 :(得分:0)

您可以尝试使用.observeSingleEventOfType(FIRDataEventType.Value, ...

请注意,它没有内置循环,也没有注意数据库中的更改。您只需获取数据即可,