我在做什么错?我有一个数据库结构,如图所示。
在appleDelegate.swift中,我只想检查在“用户”节点下是否确实存在某个用户令牌。也就是说,如果“用户”具有子currentUserID(字符串令牌)。我知道observeSingleEvent是异步执行的。我很快就收到此错误:“应用程序窗口在应用程序启动结束时应具有根视图控制器”。在“ func application(_ application:UIApplication)”中,我有此代码。下面也有我的完成处理函数。
if let user = Auth.auth().currentUser{
let currentUserID = user.uid
ifUserIsMember(userId:currentUserID){(exist)->() in
if exist == true{
print("user is member")
self.window?.rootViewController = CustomTabBarController()
} else {
self.window?.rootViewController = UINavigationController(rootViewController: LoginController())
}
}
return true
} else {
self.window?.rootViewController = UINavigationController(rootViewController: LoginController())
return true
}
}
func ifUserIsMember(userId:String,completionHandler:@escaping((_ exists : Bool)->Void)){
print("ifUserIsMember")
let ref = Database.database().reference()
ref.child("users").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChild(userId) {
print("user exists")
completionHandler(true)
} else {
print("user doesn't exist")
completionHandler(false)
}
})
}
答案 0 :(得分:1)
我建议将代码从应用程序委托中移出,并移入初始的viewController中。从那里确定这是否是现有用户,然后将该用户发送到适当的UI。
.observeSingleEvent在给定位置加载所有节点-一种用途是在它们上进行迭代以填充数据源。如果您有10,000个用户,则在观察/ users节点时将全部加载。
在这种情况下,确实没有必要。最好只观察您感兴趣的单个节点,如果有,将用户发送到现有用户的UI。
这是执行此操作的代码
if let user = Auth.auth().currentUser {
let ref = self.ref.child("users").child(user.uid)
ref.observeSingleEvent(of: .value, with: { snapshot in
self.presentUserViewController(existing: snapshot.exists() )
})
}
snapshot.exists如果存在用户节点,则为true;否则为false,因此功能presentUserViewController会接受布尔值,然后根据用户类型来设置UI。