SwiftUI和完成处理程序有问题

时间:2020-10-11 02:35:49

标签: swiftui completionhandler

我正在尝试让一个用户选择其用户名;如果在注册过程中尚未使用该证书,则可以继续进行操作,否则无法注册。

我有以下内容:

Button(action: {

    if (self.verifyUsername(username: self.username)) {
                        
        withAnimation {
                           
            self.isTaC.toggle()
                            
        }
                    
    }) {
                    
        Text("Save Profile and Agree")
                    
    }

调用以下内容:

func verifyUsername(username: String) -> Bool {
    
    userStore.usernameExists(username: username) { flag in
        
        if (flag) {
            
            return true
        
        } else {
        
            return false
        
        }
        
    }
    
}

最后是从Firebase获取信息的用户存储:

func usernameExists(username: String, completion: @escaping (Bool) -> Void) {
    
    usernameRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
        
        if (snapshot.exists()) {
            
            print("Username Exists")
            completion(true)
            
        } else {
            
            print("Username DOESN'T Exists")
            completion(false)
            
        }
        
    })
    
}

我遇到了编译器错误<<对于我的代码的userStore.usernameExists(username: username) { flag in部分,我无法理解为什么将'()'类型的返回表达式转换为'Bool'>>类型?

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您的验证是异步的,因此您应该使用回调而不是返回值。

所以它应该看起来像下面的

Button("Save Profile and Agree") {

    self.verifyUsername(username: self.username)) {
        withAnimation {
            self.isTaC.toggle()
        }
    }                    

}

// ...

func verifyUsername(username: String, processForCorrect: @escaping () -> ()) {
    userStore.usernameExists(username: username) { flag in
        if (flag) {
          DispatchQueue.main.async {
            processForCorrect()
          }
        }
    }
}