我正在使用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运行。
这与我的原始问题无关,但是我想知道检查用户是否已经登录然后登录的正确方法。因为显然我的方法行不通。
答案 0 :(得分:2)
为什么不尝试使用Completion Handler块来关闭,如下所示。
self.dismiss(animated: true, completion: {
if let vc = self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController") as? SignInViewController{
UIApplication.shared.keyWindow?.rootViewController = vc
}
})