无法为闭包内的变量赋值 Swift

Can't assign a value to variable inside of closure Swift

我正在尝试从 Firebase 获取属于特定用户的当前文档数。 每当我尝试在闭包中为我的变量分配计数值时,值总是显示为 nill。 所以我做了一些研究,结果我发现网络有时需要很长时间,而且它是异步发生的。因此,如果我没有错,因为异步 return 在函数内部赋值可能发生在赋值之前。

我尝试添加 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 值。使用该值,我将在 table 视图中表示来自 firestore 的事件文档中的一些数据。

注意:当我尝试在闭包中打印计数值时它显示所需的值,但是当函数 return 值显示为 nill...

一旦它是异步调用 - 您就不能同步 return 来自函数的值。您应该接受对将接受计数的函数的回调。该回调函数或闭包将异步传递值。

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)
        }
    }
}

然后你可以调用这个函数传入回调

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)
  }
}

注意:在上面我使用了来自 Swift 标准库的结果数据类型 - https://developer.apple.com/documentation/swift/result 所以两个错误 或者返回结果