【问题标题】:Having an issue with SwiftUI and completion handlersSwiftUI 和完成处理程序有问题
【发布时间】:2020-10-11 02:35:49
【问题描述】:

我正在尝试让用户选择他们的用户名;如果在注册期间尚未使用,他们可以继续,否则他们无法注册。

我有以下几点:

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 部分出现编译器错误>,我不明白这是为什么?

谁能帮我解决这个问题?

【问题讨论】:

  • verifyUsername 应该返回Bool,但它没有。它只调用userStore.usernameExists,因为它是唯一的语句,所以有一个隐含的return,无论userStore.usernameExists 的返回值是什么,它是……Void()

标签: swiftui completionhandler


【解决方案1】:

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

所以它应该如下所示

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()
          }
        }
    }
}

【讨论】:

  • 再次感谢...它的工作原理,我想我唯一的另一个问题是我如何让它抛出一个错误来通知用户用户名已经被使用,这就是我最初使用 func 的原因返回真/假,以便我可以将错误消息扔给用户?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多