首页 > 解决方案 > 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)
            }
        }
    }
}
}

标签: swiftxcodefunctionasynchronous

解决方案


当一个函数是异步的时,你不想返回值,你想在完成中将它传回。

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 值调用完成处理程序。

不过有两件事:

  1. 为什么要放入checkDayEqualsToDoc异步线程?

  2. 变量名应该始终以小​​写开头,并且应该比Var


推荐阅读