Swift Can';t为闭包内的变量赋值
我正在尝试从Firebase获取属于spesific用户的当前文档计数。 每当我试图给闭包中的变量赋值时,值总是显示为nill。 所以我做了几项研究,结果我发现联网有时需要很长时间,而且是异步的。所以,如果我没有错,因为异步返回函数中的值可能发生在赋值之前 我尝试添加dispatchqueue.main.async,但对我无效 这是我的代码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
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)
}
}