关闭包含mapview的View Controller后,Mapview委托函数继续运行

时间:2019-05-03 09:33:26

标签: ios swift firebase delegates mapbox

我正在使用mapbox和firebase。 我有一个委托函数,当用户位置更改时,该函数会更新用户的坐标(在firebase数据库内部)。 据我所知,它在登录应用程序时应能正常运行。 mapviews委托是视图控制器(self.mapView.delegate = self

func mapView(_ mapView: MGLMapView, regionDidChangeAnimated animated: Bool){
            let latitude = mapView.userLocation?.coordinate.latitude
            let longitude = mapView.userLocation?.coordinate.longitude
          Database.database().reference().child(pathToCoord).updateChildValues(["latitude":latitude, "longitude":longitude], withCompletionBlock: { (err, ref) in
            if err != nil { print(err!); return }
        }

退出应用程序后,我想停止更新用户位置。 理想情况下,我只希望带有地图的View Controller完全消失,并使其中的所有内容停止运行。 我已经编写了此退出功能,尝试了几种不同的方法来确保位置不再更新。

func signOut(){

    for id in Auth.auth().currentUser?.providerData{
        if id.providerID == "facebook.com"{
            FBSDKLoginManager().logOut()
        }
    }
    do {
        try Auth.auth().signOut()
    }catch let logoutError {
        print(logoutError)
    }


    self.mapView.delegate = nil
    if let vc = self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController") as? SignInViewController{
        UIApplication.shared.keyWindow?.rootViewController = vc
            self.dismiss(animated: true, completion: nil)
    }

}

虽然有时我注销了,但在控制台中不断出现以下错误。对于这种情况,我能想到的最合逻辑的解决方案是View Controller仍在运行。我不知道如何使它停止。

[Firebase/Database] updateChildValues: at `path/to/coord` failed: permission_denied
Error Domain=com.firebase Code=1 "Permission denied" UserInfo={NSLocalizedDescription=Permission denied}

编辑

所以看起来问题可能出在我的SignInViewController中

    if let uid = Auth.auth().currentUser?.uid{
               if let vc = self.storyboard!.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController{
        vc.uid = uid
        UIApplication.shared.keyWindow?.rootViewController = vc

    }
    }

然后,委托将为每个uid运行一次,就像两个视图控制器在同一时间运行一样。当我注销时,我猜是另一个没有退出,并一直在为另一个用户ID运行。

这与我的原始问题无关,但是我想知道检查用户是否已经登录然后登录的正确方法。因为显然我的方法行不通。

1 个答案:

答案 0 :(得分:2)

为什么不尝试使用Completion Handler块来关闭,如下所示。

self.dismiss(animated: true, completion: {
    if let vc = self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController") as? SignInViewController{
        UIApplication.shared.keyWindow?.rootViewController = vc

   }
})