无法为闭包内的变量赋值 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 所以两个错误
或者返回结果
我正在尝试从 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 所以两个错误 或者返回结果