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"返回"的值,因此您使用该布尔值调用您的完成处理程序。

不过有两件事:

  1. 为什么要将checkDayEqualsToDoc放在异步线程中?

  2. 变量名称应始终以小写字母开头,并且应比Var更具描述性

最新更新