Swift Can';t为闭包内的变量赋值

Swift Can';t为闭包内的变量赋值,swift,firebase,asynchronous,google-cloud-firestore,closures,Swift,Firebase,Asynchronous,Google Cloud Firestore,Closures,我正在尝试从Firebase获取属于spesific用户的当前文档计数。 每当我试图给闭包中的变量赋值时,值总是显示为nill。 所以我做了几项研究,结果我发现联网有时需要很长时间,而且是异步的。所以,如果我没有错,因为异步返回函数中的值可能发生在赋值之前 我尝试添加dispatchqueue.main.async,但对我无效 这是我的代码 func getEventCount () -> Int? { var count: Int? db.collection("Eve

我正在尝试从Firebase获取属于spesific用户的当前文档计数。 每当我试图给闭包中的变量赋值时,值总是显示为nill。 所以我做了几项研究,结果我发现联网有时需要很长时间,而且是异步的。所以,如果我没有错,因为异步返回函数中的值可能发生在赋值之前

我尝试添加dispatchqueue.main.async,但对我无效

这是我的代码

 func getEventCount () -> Int? {
    var count: Int?
    db.collection("Events").whereField("owner", isEqualTo: currentUser.email).getDocuments { (snapshot, error) in
        if error != nil {
            print(error)
        }else {
            DispatchQueue.main.async {

                if let snapshot = snapshot {
                    count = snapshot.count
                }

            }
        }
    }
    return count
}
我的主要目标是从数据库中获取计数数据,并将其分配给“count”变量。 那么为什么我需要那个计数变量呢?因为我将把这个计数值传递给tableView数据源方法numberOfRowsInSection,它需要一个int值。使用该值,我将在表视图中表示firestore事件文档中的一些数据。


注意:当我尝试在闭包中打印count value时,它会显示所需的值,但当函数返回值时,它会显示为nill…

一旦它是异步调用,则无法从函数同步返回值。您应该接受对将接受计数的函数的回调。该回调函数或闭包将异步传递该值

func getEventCount (callback: @escaping(Result<Int, Error>) -> Void) {
    db.collection("Events").whereField("owner", isEqualTo: currentUser.email).getDocuments { (snapshot, error) in
        if error != nil {
            let result = Result.failure(error)
            callback(result)
        }else if let snapshot = snapshot {
               let result = Result.success(snapshot.count)
               callback(result)
        } else {
            let result = Result.failure(SomeCustomAppError)
            callback(result)
        }
    }
}
注意:在上面我使用了来自Swift标准库的结果数据类型-因此两个错误
或者结果可以传回

您不需要在Firebase闭包中使用此
DispatchQueue.main.async
,并且您不能在那里使用
return
,因为Firebase是异步的。另外,该
count
变量的计划是什么。如果我们有更多的信息,我们可能会建议一个解决方案。@Jay我确实编辑了这个问题,你能检查一下吗?所以其他人关闭了这个问题,提供的链接是一个很好的阅读。填充数据源时,数据源应为类var数组,然后使用Firebase闭包中的数据填充它。该数组确定numberOfRowsInSection使用的计数。看看我对你的回答。我的答案是一个简单的完成处理程序示例。
self.getCount() { result in
  switch result {
   case .success(let count): /// use count
   print(count)
   // only here u can assign the count value to ur variable
   case .error(let error): /// handle error
   print(error.localizedDescription)
  }
}