【问题标题】:set user location with GeoFire in Xcode 10在 Xcode 10 中使用 GeoFire 设置用户位置
【发布时间】:2020-01-18 16:43:24
【问题描述】:

我的编码(如您将看到的)和对 Xcode 和 Swift 的熟悉是基本的,但我正在学习......我意识到我的代码嵌套不是最好的,如果有的话。我正在尝试将 GeoFire 集成到我的 Xcode 10 应用程序中。我一直在寻找一个明确的解释,但我仍然没有找到答案。我有一个注册用户的注册表格。最初的 Firebase 设置很简单,我有一个功能齐全的表单,可以在 Firebase 中注册用户。现在我正在尝试添加 GeoFire 以跟踪用户的位置。

我在 YouTube 视频和网站上尝试了很多方法,但都没有奏效。

import UIKit
import Foundation
import CoreLocation
import Firebase
import GeoFire

class SecondViewController: UIViewController {

    //Firebase DB ref
    var refDriver: DatabaseReference!




    @IBOutlet weak var name: UITextField!

    @IBOutlet weak var employeenumber: UITextField!    

    @IBOutlet weak var label: UILabel!


    @IBAction func submit(_ sender: UIButton) {
        addDriver()
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //configuring firebase and ensures no error is returned
        if(FirebaseApp.app() == nil){
            FirebaseApp.configure()

        }


        //getting a reference to the node driver
        refDriver = Database.database().reference().child("driver");

    }

    func addDriver(){
        //generating a new key inside driver node
        //and also getting the generated key
        let key = refDriver.childByAutoId().key

        //creating driver with the given values
        let driver = ["id":key,
                      "name": name.text! as String,
                        "employeenumber": employeenumber.text! as String
                            ]

        //adding the driver to Firebase
        refDriver.child(key!).setValue(driver)



        //displaying submit message
        label.text = "You are registered."
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

【问题讨论】:

    标签: firebase-realtime-database ios12 swift4.2 geofire xcode10.1


    【解决方案1】:

    在安装 pod 后尝试导入模块

    import GeoFire
    
    **var geoFire: GeoFire?**
    var myQuery: GFQuery?
    

    viewdidLoad()函数中调用setupGeofire()

       override func viewDidLoad() {
           super.viewDidLoad()
           // Do any additional setup after loading the view.
           setupGeoFire()
       }
    
    
    func setupGeoFire() {
    
           let geoFireRef = Database.database().reference().child("user_locations")
           let geoFire = GeoFire(firebaseRef: geoFireRef)
           self.geoFire = geoFire
    
           loadUsersWithin(radius: 100)
       }
    

    在 setupGeoFire 中,我创建了一个 var geoFireRef,这只是您要保存用户位置信息的节点

    let geoFireRef = Database.database().reference().child("user_locations")
    

    然后我们通过传入那个节点位置来创建 geoFire 对象,我们的 geoFireRef var

    然后只需使用 geoFire 对象随处可访问 ``` self.geoFire = geoFire`` `

    如果您想获得特定半径(公里)内的用户,您也可以查看下面的函数

    func loadUsersWithin(radius: Double){
    
            guard let uid = Auth.auth().currentUser?.uid else{return}
            geoFire?.getLocationForKey(uid, withCallback: { (userLocation, err) in
    
                guard let userLocation = userLocation else{return}
                self.myQuery = self.geoFire?.query(at: userLocation, withRadius: radius)
    
                self.myQuery?.observe(.keyEntered, with: { (key, location) in
    
                    if key == uid{
                        return
                    }
                    Database.database().reference().child("users").child(key).observeSingleEvent(of: .value, with: { (snapshot) in
    
                        guard let userDictionary = snapshot.value as? [String:Any] else{return}
                        let user = User(uid: key, dictionary: userDictionary)
                        self.user = user
                        self.usersArray.append(user)
                        self.nearbyCV.reloadData()
                    }, withCancel: { (err) in
                        print(err)
                    })
                })
            })
    
        }
    }
    

    这是我的 User.swift 数据模型

    import UIKit
    
    class User{
    
        var name: String
        var userImgUrlString: String
        var age: String
        var uid: String
        var aboutMeText:String
    
        init(uid: String,dictionary: [String: Any]) {
    
            self.name = dictionary["username"] as? String ?? ""
            self.userImgUrlString = dictionary["profileImageUrlString"] as? String ?? ""
            self.aboutMeText = dictionary["aboutMe"] as? String ?? ""
            self.uid = uid
            self.age = dictionary["age"] as? String ?? ""
        }
    }```
    hope this helps yo it was hard to find info for me too when i just started but it gets better
    

    【讨论】:

    • 是的,它确实有帮助,而且比我能找到的要好得多。但是,我现在有 2 个错误:let user = User(uid: key, (参数传递给不带参数的调用) 和 self.nearbyCV.reloadData() ('SecondViewController' 类型的值没有成员 'nearbyCV')
    • @Peter User 是我用来保存数据的数据模型或结构,因此如果您没有 User.swift 文件,那么它不会知道它是什么。和我正在使用的 UiCollectionView 的 neabyCV 插座。 ".reloadData()" 调用 numberOfRows 函数和其他委托方法以用新数据重新填充 collectionView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多