【问题标题】:Firebase for SWIFT iOS: returning nil value in function [duplicate]适用于 SWIFT iOS 的 Firebase:在函数中返回 nil 值 [重复]
【发布时间】:2020-09-26 08:54:55
【问题描述】:

我正在尝试访问我的 firestore 数据库,该数据库存储了名为 user 的集合中的用户 ID、用户名,我想返回当前用户的用户名,但是当我尝试运行以下函数时,它返回给我 nil 值....你知道我错过了什么吗?完成处理程序?

func display(userid: String) -> String
{
    var displayname: String
    let docRef = db.collection("user").document(uid)
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            displayname = document.get("username") as! String
            
        } else {
            print("Document does not exist")
        }
    }
    return displayname
}

然后我试图改变这个,但它仍然没有改变我的变量。它似乎被困在我的函数中

var name = "placeholder"

func display(userid: String, completion: @escaping (String) -> Void) {
    let docRef = db.collection("user").document(userid)
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            if let displayName = document.get("username") as? String {
                self.name = displayName
                completion(displayName)
            }
        } else {
            print("Document does not exist")
        }
    }
}

func create()
{
    display(userid: uid){
        [weak self] displayName in
        print(displayName)
        self!.name = displayName
    }
var ref: DocumentReference? = nil
ref = db.collection("Request").addDocument(data: ["requestername": "name"]

.....
}
                                                
    

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    您需要使用闭包,因为getDocument() 不会同步返回。

    func display(userid: String, handler: (String) -> Void) {
        let docRef = db.collection("user").document(uid)
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                if let displayName = document.get("username") as? String {
                    handler(displayName)
                }
            } else {
                print("Document does not exist")
            }
        }
    }
    

    然后像这样使用它:

    self.myLabel.text = "Loading..."
    display(userid: {USER_ID}) { [weak self] displayName in
        print(displayName)
        self.myLabel.text = displayName
    }
    

    【讨论】:

    • 嗨 Eilon,感谢您的回复。但是,当我调用此函数时,我想返回将显示在文本标签中的用户名..但是当我尝试在文本标签中显示时..它说..无法将 value () 赋值给类型 String..你知道为什么吗?
    • 您不能将其用作普通函数,因为调用是异步的,而函数是同步的。查看更新的答案以获取更具体的示例。
    • 非常感谢!我也添加了@escaping,以便我的功能可以在其他地方工作!
    猜你喜欢
    • 2019-02-28
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2017-09-17
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多