handleDateAndTimeFetch

handleDateAndTimeFetch

标题很可能用词不对,但我会发布我的代码,你可以自己判断。。。
我想从一个有闭包的函数返回一个String(该闭包从另一个函数获取一个值:

    //call the ServerTimeReturn function and print the results------------ current, from
func handleDateAndTimeFetch() -> String {

    var thisIsTheDate : String?

    serverTimeReturn { (getResDate) -> Void in //Handles the value received from Google and formats it

        let dFormatter = DateFormatter()
            dFormatter.dateStyle = .short
            dFormatter.timeStyle = .medium
            dFormatter.timeZone = TimeZone(abbreviation: "UTC")

        thisIsTheDate = dFormatter.string(from: getResDate!)
    }
        if thisIsTheDate != nil {
            return thisIsTheDate!
        } else {return "AppDelegate > handleDateAndTimeFetch() > 'thisIsTheDate' was not passed a value (was nil)"}
} //End of function


//Call Google's server for the current date & time in UTC (Coordinated Universal Time)----------------------------
func serverTimeReturn(completionHandler:@escaping (_ getResDate: Date?) -> Void){

    let url = URL(string: "https://www.google.com")
    let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in
        let httpsResponse = response as? HTTPURLResponse
        if let contentType = httpsResponse?.allHeaderFields["Date"] as? String {

            let dFormatter = DateFormatter() //A formatter object
            dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"

            let serverTime = dFormatter.date(from: contentType)
            completionHandler(serverTime)

            guard let _ = data, error == nil else {
                print(error ?? "Unknown error")
                return
            }

        }
    }
        print("Retrieved date value")
    task.resume()
}

为了总结以上内容,我在其他地方调用handleDateAndTimeFetch(),当调用时,它调用serverTimeReturn,从Google服务器检索当前日期和时间。serverTimeReturn使用一个completionHandler来确保在将数据返回到其调用handleDateAndTimeFetch()之前对其进行检索。现在回到handleDateAndTimeFetch()中,在将其分配给值thisIsTheDate之前,我做了一些格式化工作(我在闭包之外定义了这个值),以便handleDateAndTimeFetch()可以将其返回到我在别处启动整个过程的地方。
问题是,我认为handleDateAndTimeFetch()试图在从thisIsTheDate收集完成之前返回serverTimeReturn,因为该值始终为“nil”,并且它会打印我的else语句。
我的问题是,当我在serverTimeReturn中调用handleDateAndTimeFetch()时,如何在那里添加completionHandler以便在返回thisIsTheDate字符串之前确定有一个值?
相信我,我已经很努力地想办法了,但我的新思维是不允许的哈哈。
非常感谢!

最佳答案

完成一个服务器方法并不意味着您可以在另一个方法中直接使用它的返回,对serverTimeReturn的调用是异步的,因此您不能直接从handleDateAndTimeFetch返回字符串,您必须为handleDateAndTimeFetch设置一个完成

func handleDateAndTimeFetch(completionHandler:@escaping (_ getResDate: String?) -> Void) {
     serverTimeReturn { (getResDate) -> Void in //Handles the value received from Google and formats it

        let dFormatter = DateFormatter()
        dFormatter.dateStyle = .short
        dFormatter.timeStyle = .medium
        dFormatter.timeZone = TimeZone(abbreviation: "UTC")
        let thisIsTheDate = dFormatter.string(from: getResDate!)
        completion(thisIsTheDate)
  }
}

或者在serverTimeReturn中设置所有格式并返回字符串(我建议这样做),因为不需要执行两个函数来等待相同的异步任务

关于swift - 在Swift中,如何在已经使用One的函数中使用完成处理程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50072238/

10-12 14:34