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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 的 Swift 完成处理程序

如何使用 swift 和 firebase 正确使用完成处理程序?

Swift 中的完成处理程序 Firebase 观察者

setValue() 的完成导致 Firebase 崩溃,Swift 3

Swift 4 完成处理程序:数组保持为空

Swift 完成处理程序 - 转义尾随闭包