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

将Firestore文档的值分配给变量

谈萧迟
2023-03-14
问题内容

我正在尝试读取Firestore文档的值。我尝试了两种不同的方法,但是每种方法都失败了。在第一个中,在返回行上引发错误Unexpected non- void return value in void function。我发现了发生这种情况的原因,因此,我实现了第二种方法。

import UIKit
import Firestore

func readAvailableLists(forUser user: String) -> [String] {
    let db = Firestore.firestore()
    db.collection("userslist").document(user).getDocument { (document, err) in
        if let document = document, document.exists {
            return UserInformationDocument(dictionary: document.data()!)?.lists!
        } else {
            print("Document does not exist")
        }
    }
}

在第二种方法中,我将分配UserInformationDocument(dictionary: document.data()!)?.lists!给变量,然后在函数末尾返回该变量(请参见下面的代码)。但是,当我这样做时,该函数将返回一个空数组。让我惊讶的是,打印返回了正确的值,但是在函数执行了return语句后不久。是否因为它是异步需求?如果是这样,我应该如何解决呢?

import UIKit
import Firestore

func readAvailableLists(forUser user: String) -> [String] {
    let db = Firestore.firestore()
    var firestoreUserDocument: [String] = []
    db.collection("userslist").document(user).getDocument { (document, err) in
        if let document = document, document.exists {
            firestoreUserDocument = (UserInformationDocument(dictionary: document.data()!)?.lists!)!
        print((UserInformationDocument(dictionary: document.data()!)?.lists!)!)
        } else {
            print("Document does not exist")
        }
    }
    return firestoreUserDocument
}

问题答案:

Firebase调用是一个异步函数。由于它正在与服务器通信(如您所述),因此需要花费额外的时间来执行-
结果,完成块(在您的示例中定义documenterr在您的示例中定义的块)发生在主体其余部分之外的不同时间功能的 这意味着您不能从其内部 返回
值,但可以将另一个闭包传递给它,以便稍后执行。这称为 完成块

func readAvailableLists(forUser user: String, completion: @escaping ([String]?, Error?) -> Void) -> [String] {
    let db = Firestore.firestore()
    db.collection("userslist").document(user).getDocument { (document, err) in
        if let document = document, document.exists {
            // We got a document from Firebase. It'd be better to
            // handle the initialization gracefully and report an Error
            // instead of force unwrapping with !
            let strings = (UserInformationDocument(dictionary: document.data()!)?.lists!)!
            completion(strings, nil)
        } else if let error = error {
            // Firebase error ie no internet
            completion(nil, error)
        }
        else { 
            // No error but no document found either
            completion(nil, nil)
        }
    }
}

然后,您可以这样在代码的其他位置调用此函数:

readAvailableLists(forUser: "MyUser", completion: { strings, error in
    if let strings = strings {
        // do stuff with your strings
    }
    else if let error = error {
        // you got an error
    }
})


 类似资料:
  • 问题内容: 在上面,这是硬代码。我想将 变量 分配 给值。即,均值=注册; 让我知道! 问题答案: 您的问题不是很清楚。我假设变量是在Servlet中声明的,因为在JSP中使用Java是一种不好的做法。为了能够在转发到JSP的Servlet之间共享变量,您需要将此变量设置为request属性: 然后在JSP中,您可以使用JSP EL获得“ registration”属性的值: 您应该阅读Java

  • 我是helm的新手,我希望能够使用配置映射和共享环境变量将gitlab项目变量写入文件。 我为每个环境(其中

  • 问题内容: 我正在使用以下代码: 该值不警报。怎么了 问题答案: 实质上:

  • 问题内容: 我想要使用在Python中使用函数返回值将值分配给shell变量的解决方案的PHP等效方案 在我的php文件中,我读取了一些常量值,例如: 到目前为止,在我的shell脚本中,我有以下代码:- 我能够通过外壳正确执行文件。 要进一步了解我要执行的操作,请检查从PHP文件读取配置设置并使用Shell脚本上传整个项目代码的最干净方法 更新 更正为 解 正如Fritschy回答的那样,它可以

  • 问题内容: 嗨,我正在使用Java Optional。我看到Optional有一个ifPresent方法。 而不是做类似的事情: 我想知道如何使用Optional.ifPresent()将值分配给变量。 我正在尝试类似的东西: 我需要lambda函数来获取分配给该变量的值是什么? 问题答案: 您可以使用#orElse或orElseThrow来提高代码的可读性。

  • 问题内容: 为什么以下代码无法编译 但是以下确实可以编译 在这两种情况下,我不只是将整数值分配给char吗? 问题答案: 可以将A 分配给不带强制转换的,因为这是扩大的转换。反之,将a 转换为a 需要转换,因为这是缩小的转换。 另请参见JLS。第5章。转换和升级。