Функция делегата Mapview продолжает работать после закрытия View Controller, содержащего mapview. - PullRequest
2 голосов
/ 03 мая 2019

Я использую 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

    }
    }

И тогда делегат будет запускаться один раз для каждого идентификатора пользователя, как если бы два контроллера представления работали одновременно.Когда я выходил из системы, я предполагаю, что другой не вышел из системы и продолжал работать для другого идентификатора пользователя.

Это не по теме моего первоначального вопроса, но я хотел бы знать, что правильноспособ проверить, если пользователь уже вошел в систему, а затем войти в него.Потому что, очевидно, мой метод не сработал.

1 Ответ

2 голосов
/ 03 мая 2019

Почему бы вам не попробовать отклонить с помощью блока Completion Handler, как показано ниже.

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

   }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...