swift - Swift 函数返回得太早
问题描述
在以下代码中,该函数将在checkDayEqualsToDoc函数返回布尔值并更改“Var”之前返回“Var”。我已经尝试在很多地方寻找答案,但我一直看到同样的事情......使用闭包......使用完成......等等。在这种情况下,这些是正确的东西吗?如果是这样,我将如何实施?
func dotMarker(shouldShowOnDayView dayView: DayView) -> Bool {
var Var:Bool = false
let dDate = dayView.date.convertedDate()
DispatchQueue.main.async {
self.checkDayEqualsToDoc(date: dayView.date.convertedDate()!){ (bool, error) in
Var = bool
}
}
return Var
}
这是checkDayEqualsToDoc函数:
func checkDayEqualsToDoc(date: Date, completionHandler:@escaping (Bool, Error?) -> Void){
var Variable = false
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: date)
let btRef = db.collection("bomtracking")
let myDate = date
let startOfDate = myDate.startOfDay
let endOfDate = myDate.endOfDay
let dateAtBeginning = date.firstSecondInDay()
let dateAtEnd = date.lastSecondInDay()
let query = btRef
.whereField("UID", isEqualTo: UID)
.whereField("timestamp", isGreaterThan: dateAtBeginning)
.whereField("timestamp", isLessThan: dateAtEnd)
DispatchQueue.main.async {
query.getDocuments(){ (querySnapshot, err) in
if let err = err {
print("error getting documents: \(err)")
} else {
for document in querySnapshot!.documents{
let curValid = document.get("valid")
let curValidA = Bool(curValid as! Bool)
if curValidA == true {
let curdoc = document.get("timestamp")
let curdocDate = self.dateConversion(curdoc as! Date)
let dateConverted = self.dateConversion(date)
if curdocDate == dateConverted {
Variable = true
break
}
else {
Variable = false
}
}
}
completionHandler(Variable, nil)
}
}
}
}
}
解决方案
当一个函数是异步的时,你不想返回值,你想在完成中将它传回。
func dotMarker(shouldShowOn dayView: DayView, completion: @escaping (Bool)->Void) {
let dDate = dayView.date.convertedDate()
DispatchQueue.main.async {
self.checkDayEqualsToDoc(date: dayView.date.convertedDate()!){ (bool, error) in
completion(bool)
}
}
}
这会是什么样子。当checkDaysEqualsToDoc
完成时,它会调用自己的完成,这就是 的(bool, error) in
来源。在该完成中,您拥有想要dotMarker
“返回”的值,因此您使用该 bool 值调用完成处理程序。
不过有两件事:
为什么要放入
checkDayEqualsToDoc
异步线程?变量名应该始终以小写开头,并且应该比
Var
推荐阅读
- javascript - Kendo UI dataSource 传输调用 php 函数
- angular - Angular 7 路由在部署到 Apache 2 HTTPD 服务器时不起作用
- jquery - 如何在html列表视图中隐藏和显示哪个是IEnumerable模型表的一部分
- mariadb - 当 my.cnf 中的 innodb 未注释时,MariaDB 列存储未启动
- java - Java 计算一个布尔数组
- c++ - 使用 argv 和 argc 打开一个 txt 文件
- wordpress - 值在定制器的定制控件中输出两次
- php - 在 php 中解码 JSON 文件时出现无效参数错误
- r - 正则表达式查看 R 中的限制
- php - 使用条件语句将值插入另一个表