通过快速关闭从函数中检索值

Posted

技术标签:

【中文标题】通过快速关闭从函数中检索值【英文标题】:Retrieve value from function with swift closure 【发布时间】:2020-06-08 09:36:48 【问题描述】:

我想使用 firebase firestore 收集有关用户的信息,我在一个 Class a 函数中执行此操作,但我想与我的 struct ContentView 共享此信息。

class UserData : ObservableObject 
    // Use Firebase library to configure APIs
    @Published var db = Firestore.firestore()

    @Published var WholeDocument : Array<String> = []

    func GetAllData(completion: @escaping (Array<String>) -> ())  

        db.collection("Users").getDocuments()  (querySnapshot, err) in
            if let err = err 
                print("Error getting documents: \(err)")
                completion([""])
             else 
                for document in querySnapshot!.documents 
                    //print("\(document.documentID) => \(document.data())")
                    self.WholeDocument.append(document.documentID)

                
                completion(self.WholeDocument)
            



        

我尝试在我的 contentView 中收集这个数组

func Connection()
    

        self.Database.GetAllData(tab) in
            if tab.count > 0 

                self.WholeDocumentContentView = tab

            
            else 
                 print("Not found")
            

        

如何用闭包检索 WholeDocument 数组? 谢谢你的帮助。

【问题讨论】:

【参考方案1】:

如果我正确理解结构/问题,您的目标是在另一个 SwiftUI 视图中访问 WholeDocument 数组。这样做的方法可能是:

class UserData : ObservableObject 

    // Use Firebase library to configure APIs
    private var db = Firestore.firestore()

    @Published var WholeDocument : Array<String> = []

    init() 
        db.collection("Users").getDocuments()  (querySnapshot, err) in
            if let err = err 
                print("Error getting documents: \(err)")
                completion([""])
             else 
                for document in querySnapshot!.documents 
                    // print("\(document.documentID) => \(document.data())")
                    self.WholeDocument.append(document.documentID)
                
            
        
    


struct MyContentView : View 

    @ObservedObject var database: UserData

    var body: some View 
        // access database.WholeDocument
        List(database.WholeDocument, id: \.self) 
        // do something
    

这样,当您使用UserData 的实例初始化MyContentView 时,您将能够在该视图中观察WholeDocument

【讨论】:

它有效,谢谢,它是否有另一种方法可以通过@escape 关闭,也许我没有弄清楚这个概念。 您应该能够在.onAppear 闭包或其他东西中运行UserData 中的任何函数(如果您希望它以恒定的时间间隔更新,您可以使用matt 的答案here)并通过 Connection() 作为闭包,是的 好的,我明白了,谢谢。

以上是关于通过快速关闭从函数中检索值的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从对象中检索值 - JS [关闭]

如果值是列表/数组,则从快速路由器中检索值

通过托管标识从 c# Azure 函数检索配置值的 Azure 应用程序配置不起作用

如何从一个函数检索对象/变量的值到另一个函数并通过 main 调用这两个函数?

Mysql之索引原理

通过内连接从不同的表中检索值