在异步闭包Swift内赋值[重复]

qpgpyjmq  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(136)
    • 此问题在此处已有答案**:

(13个答案)
两年前关闭了。
我尝试获取Firebase中的文档计数。每当我尝试在闭包中为文档计数分配变量时,值都是null。根据文章,联网需要一些时间,并且是异步发生的。因此,由于异步行为,在闭包中返回值可能会在赋值之前发生。
我尝试添加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的变量。
zdwk9cvp

zdwk9cvp1#

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

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标准库中的Result数据类型-https://developer.apple.com/documentation/swift/result,这样错误和结果都可以被传递回来

相关问题