Firebase Swift 3 完成处理程序 Bool
Posted
技术标签:
【中文标题】Firebase Swift 3 完成处理程序 Bool【英文标题】:Firebase Swift 3 Completion handler Bool 【发布时间】:2016-10-19 15:07:32 【问题描述】:我正在尝试为一个检查用户是否是 firebase 团队成员的函数编写完成处理程序。
我有一个公共类customFunctions
,我在其中创建了一个函数ifUserIsMember
。我似乎有点坚持完成处理程序的想法,并且似乎无法弄清楚如何在完成时检查 bool 值(如果这有意义的话)。这是我的课程代码:
import Foundation
import GeoFire
import FirebaseDatabase
public class customFunctions
func ifUserIsMember(userid: String, completionHandler: @escaping (Bool) -> ())
let ref = FIRDatabase.database().reference()
ref.child("teammembers").observeSingleEvent(of: .value, with: (snapshot) in
if snapshot.hasChild(userid)
completionHandler(true)
else
print("user is not a member of a team")
completionHandler(false)
)
这就是我所说的:
@IBAction func signInButtonAction(_ sender: AnyObject)
//check if user is a member of a team
let userid = self.uid
checkFunctions.ifUserIsMember(userid: userid) success in
print("user is a member of a team")
self.updateLocation(type: "in")
无论snapshot.hasChild(uerid)
是否真的有那个userid
,它似乎都返回true
【问题讨论】:
这听起来不像是问题出在块中,因为你调用它是正确的。似乎问题在于检查快照是否具有该孩子。如果你设置断点,你总是调用completionHandler(true)
吗?
不,它似乎第一次通常总是在第一次按下按钮时返回 false(当用户实际上是该团队的成员时),但第二次返回 true。跨度>
其实没关系 - 恰恰相反。即使用户不是团队成员,它仍在调用 self.updatelocation
【参考方案1】:
尝试使用:-
func ifUserIsMember(userid: String, completionHandler: @escaping ((_ exist : Bool) -> Void))
let ref = FIRDatabase.database().reference()
ref.child("teammembers/\(userid)").observeSingleEvent(of: .value, with: (snapshot) in
if snapshot.exists()
completionHandler(true)
else
print("user is not a member of a team")
completionHandler(false)
)
【讨论】:
表示函数类型不能有参数标签“存在” 还是和以前一样的问题。一切正常,但由于某种原因,当用户不是会员时它仍然无法正常工作。它先返回false,之后直接返回true。 在您第一次按下后禁用该按钮:-sender.isEnabled = false
然后在 if 块中再次启用它
不是双击。我在完成处理程序返回 true 时添加了一个断点,并使用了应该始终返回 false 的用户帐户。当我这样做时,它首先返回“用户不是成员”(预期的行为),然后到达断点。所以我最好的猜测是由于某种原因它没有正确处理 if exists 检查
我会将您的答案标记为已接受 - 因为它引导我找到我的解决方案。在 ifUserIsMeber 中添加 @escaping ((_ exist : Bool) -> Void))
,然后将我的 signInButtonAction 更改为 checkFunctions.ifUserIsMember(userid: userid) (exist) -> ()
是解决方案【参考方案2】:
对于遇到此问题的其他人,这是为我解决的问题。
@IBAction func signInButtonAction(_ sender: AnyObject)
//check if user is a member of a team
let userid = self.uid
checkFunctions.ifUserIsMember(userid: userid) (exist) -> () in
if exist == true
print("user is a member of a team")
self.updateLocation(type: "in")
else
print("user is not a member")
public class customFunctions
let ref = FIRDatabase.database().reference()
func ifUserIsMember(userid: String, completionHandler: @escaping ((_ exist : Bool) -> Void))
ref.child("teammembers").observeSingleEvent(of: .value, with: (snapshot) in
if snapshot.hasChild(userid)
completionHandler(true)
else
print("user is not a member of a team")
completionHandler(false)
)
【讨论】:
【参考方案3】:Swift 3 和 Firebase 3.17.0
这样就可以了,检查 NSNull
func ifUserIsMember(userid: String, completionHandler: @escaping (Bool) -> ())
let ref = FIRDatabase.database().reference()
ref.child("teammembers").observeSingleEvent(of: .value, with: (snapshot) in
guard snapshot.value is NSNull else
print("\(snapshot) exists")
completionHandler(true)
print("\(snapshot) is not exists")
completionHandler(false)
)
【讨论】:
以上是关于Firebase Swift 3 完成处理程序 Bool的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 swift 和 firebase 正确使用完成处理程序?