当前位置: 首页 > 面试题库 >

如何通过Firebase返回在数据服务类中创建的对象?

穆季萌
2023-03-14
问题内容

我试图遵守MVC惯例,并将所有网络代码保留在我的应用程序中使用的数据服务类中。在一个屏幕上,我有需要显示的用户名和用户名。更新此函数时,我正在调用此函数:

func grabUserData() -> User {
    REF_USERS.child(getCurrentUID()).observeSingleEvent(of: .value) { 
        (snapshot) in
        if let userDict = snapshot.value as? Dictionary<String, String> {
            let user = User(
                first:    userDict["firstName"]!, 
                last:     userDict["lastName"]!, 
                username: userDict["username"]!
            )
            return user
        } 
    }
}

但是尝试返回用户时出现错误!它说:

void函数中非预期的非无效返回值。

但是该功能显然不是无效的。那我该怎么办?


问题答案:

您正在将grabUserData 函数 返回值与Firebase 闭包 返回值混淆-前者是User但后者是Void;)

您实际上是从此关闭返回的—我现在使用一个 明确的 返回类型来明确说明:

{ 
    (snapshot) -> Void in
    if let userDict = snapshot.value as? Dictionary<String,String> {
        let user = User(
            first:    userDict["firstName"]!, 
            last:     userDict["lastName"]!, 
            username: userDict["username"]!
        )
        return user
    }
}

将其作为最后一个参数传递给observeSingleEventFirebase函数。这是一个 非常 常见的错误;)

完成处理程序 。这里的标准模式是通过 完成处理程序 返回 所需的内容。该解决方案很好地模拟了网络请求(例如Firebase数据库调用)的
异步 性质。例如:User

func grabUserData(completion: @escaping (User?) -> Void) {
    REF_USERS.child(getCurrentUID()).observeSingleEvent(of: .value) { 
        (snapshot) in
        if let userDict = snapshot.value as? Dictionary<String, String> {
            let user = User(
                first:    userDict["firstName"]!, 
                last:     userDict["lastName"]!, 
                username: userDict["username"]!
            )
            completion(user) // Returns user!
        } else {
            completion(nil) // User not found!
        }
    }
}

最后,在数据服务 客户端代码中 ,像这样调用它:

grabUserData() { 
    (user) in
    if let user = user {
        print("Grabbed user: \(user)")
    } else {
        print("User not found!")
    }        
}


 类似资料:
  • 问题内容: Web服务正在返回由WSDL定义的对象,该对象为: 当我打印出该对象的类信息时,它显示为: 但我需要将此对象解组为以下类的对象: 我知道响应是正确的,因为我知道如何编组此对象的XML: 打印出: 如何将看到的对象变成我知道的对象? 此外,我在AppEngine上运行,该文件访问受到限制。 谢谢你的帮助 更新 : 我添加了注释,如下所示: 但这没有任何区别。 这与内容是的事实有关吗? 这

  • 问题内容: 我正在转换C api> Java,并且具有以下函数原型。 我想按预期返回状态,以整数形式返回“类型”,以字符串形式返回“值”(不被释放) 从文档中,我发现您创建了两个可以保留返回值的结构。 有人可以帮我做第一个吗? 问题答案: 假设函数声明存在于一个名为header.h的文件中,则可以执行以下操作: 这将隐藏“实数” ,而是替换为在(不可修改的)结构中返回输出参数和调用结果的版本。 (

  • 我是Android的新手。我想在android中创建后台服务来监听在FireStore中创建的新文档。我已经准备好了所有的代码,但是服务一次又一次地启动。 > 你能告诉我该怎么做才能开始服务一次吗。每当我打开应用程序时,它就会显示>>listener附加在控制台中。我希望它只执行一次,并保持它在后台运行。 FireStoreActivityListener.java signup.java

  • 不过就是创建结构体的时候,根据每个对象的特征赋值不同的属性罢了 // 3.创建一个结构体变量 p1 := Person{"lnj", 33} per.say() p2 := Person{"zs", 18} per.Say()

  • 我有下面的,它的返回类型是或。中的响应实体是基于的这些返回类型形成的。 如何: 1。设计以返回不同类型的 2。使根据其接收形成 这是控制器