如何解决这个关闭完成处理程序问题?

How to solve this closure completion handler issue?

我死死盯着这些功能卡了快两天了,想知道为什么我得不到我想要的结果。

这是第一个函数:

   func getTheSchoolID(completion: @escaping ((String?)-> ())) {
    db.collection("school_users").whereField("userID", isEqualTo: user!.uid).getDocuments { (querySnapshot, err) in
        if let err = err {
            print("There was an error fetching the documents: \(err)")

        } else {
            self.skoolID = querySnapshot!.documents.map { document in
                return SchoolID(schoolID: (document.get("school_id") as! String))
            }
        }
    }

    let fixedID = "\(skoolID)"
    let substrings = fixedID.dropFirst(28).dropLast(3)
    let realString = String(substrings)
    completion(realString)

}

这是对我上一个 Whosebug 问题的回答中的函数,所以我使用了它并且有点理解闭包完成处理程序的概念。

下一段代码是我想要发生但没有发生的。

    getTheSchoolID { [weak self] (realString) in
        if let id = realString {
            DispatchQueue.main.async {
                self?.schoolIDTextF.text = id

            }
        }
    }

现在,当我检查 Viewcontroller 中的文本字段时,它仍然是空的。

收集路径很好字段是正确的我什至会添加我的 firestore 数据库的屏幕截图以供参考。

如果有人能提供帮助那就太好了。如果你给我答案并且有效,我什至会发送 10 美元的 Paypal 付款。这就是它对我的意义。谢谢

你调用闭包太早了。您需要在 db...getDocuments 闭包中调用它,例如:

func getTheSchoolID(completion: @escaping ((String?)-> ())) {
    db.collection("school_users").whereField("userID", isEqualTo: user!.uid).getDocuments { (querySnapshot, err) in
        if let err = err {
            print("There was an error fetching the documents: \(err)")

        } else {
            self.skoolID = querySnapshot!.documents.map { document in
                return SchoolID(schoolID: (document.get("school_id") as! String))
            }
            let fixedID = "\(skoolID)"
            let substrings = fixedID.dropFirst(28).dropLast(3)
            let realString = String(substrings)
            completion(realString)
        }
    }
}

然后存钱买一本好书 :-)

getDocuments 异步工作,你必须调用 completion inside 闭包

func getTheSchoolID(completion: @escaping (String?) -> Void) {
    db.collection("school_users").whereField("userID", isEqualTo: user!.uid).getDocuments { (querySnapshot, err) in
        if let err = err {
            print("There was an error fetching the documents: \(err)")
            completion(nil)
        } else {
            self.skoolID = querySnapshot!.documents.map { document in
                return SchoolID(schoolID: document.get("school_id") as! String)
            }
            let fixedID = "\(self.skoolID)"
            let substrings = fixedID.dropFirst(28).dropLast(3)
            let realString = String(substrings)
            completion(realString)
        }
    }
}

而且您使用的括号过多。

map 表达式看起来很奇怪。