在Swift中,在继续编写代码之前,如何安全地确保从Google检索数据(日期和时间)?
我发现另一个问题写得很好,但它描述了如何在urlSession中使用完成处理程序来分段。。。但我很难将它应用到我的案例场景中 我想做什么:在Swift中,在继续编写代码之前,如何安全地确保从Google检索数据(日期和时间)?,swift,datetime,session,url,completionhandler,Swift,Datetime,Session,Url,Completionhandler,我发现另一个问题写得很好,但它描述了如何在urlSession中使用完成处理程序来分段。。。但我很难将它应用到我的案例场景中 我想做什么: 在谷歌服务器上以“UTC”格式查找当前日期和时间 确保在继续之前已检索到数据 将检索到的数据(日期和时间)保存在字符串变量中 到目前为止,我在代码工作中所写的内容。。。有时。。。但它并不健壮。我经常会遇到崩溃,从我有限的知识来看,我能够研究这样一个事实,即它可能与在实际检索数据之前继续执行的任务有关(有时它说我正在查找的是“零”) 下面是我调用函数进行提取的
func handleDateAndTimeFetch (fetch: String, calculate: Bool) {
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 dateAndTimeNow = dFormatter.string(from: getResDate!)
}
}
…下面是函数:
//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)
}
}
print("Retrieved date value")
task.resume()
}
…最后,这里是我在奇数时间得到的错误。如果你能,你能帮我理解这些错误到底在说什么吗
2018-04-25 21:05:55.071137-0400 JeegO[8768:3548654] TIC TCP Conn Failed [3:0x1c0176200]: 1:50 Err(50)
2018-04-25 21:05:55.071486-0400 JeegO[8768:3548654] Task <5C958839-0A62-4E06-A811-8ED9D8A4709C>.<1> HTTP load failed (error code: -1009 [1:50])
2018-04-25 21:05:55.078817-0400 JeegO[8768:3548645] Task <5C958839-0A62-4E06-A811-8ED9D8A4709C>.<1> finished with error - code: -1009
2018-04-25 21:05:55.071137-0400吉戈[8768:3548654]TIC TCP连接失败[3:0x1c0176200]:1:50错误(50)
2018-04-25 21:05:55.071486-0400吉戈[8768:3548654]任务。HTTP加载失败(错误代码:-1009[1:50])
2018-04-25 21:05:55.078817-0400吉戈[8768:3548645]任务。已完成,但出现错误-代码:-1009
(lldb)
在我继续使用我的应用程序之前,我想确保我能够检索到这些简单的数据(日期和时间),因此我非常感谢您帮助我解决这个小问题,以便我可以放心地继续前进:)
非常感谢 您的代码没有问题。您遇到错误,这意味着您的internet连接未建立 NSURLERRORNOTTENTEDTOINTERNET 请求网络资源时返回,但internet连接未建立且无法自动建立,这可能是由于缺乏连接,也可能是由于用户选择不自动建立网络连接
哪一行出现了
nil
错误?@Malik当我出现“nil”错误时,它来自于“if let contentType=httpsResponse!”行!。所有HeaderFields[“日期”]作为?字符串,其中表示标题为零??可悲的是,我甚至不完全确定日期是如何从谷歌检索到的,所以我无法提供更多的见解。。。这段代码大部分是从另一个堆栈溢出答案复制的。我有时也会收到错误代码1001和1002(我想当我收到零错误时……这在我发帖时并没有发生)。嗯,这似乎很奇怪(因为我的互联网非常强大,我从来没有在我的任何设备上丢失过它)。。。如果我在通过Xcode运行应用程序的同时退出该应用程序,则我的任何其他依赖网络的应用程序仍然可以工作…:/我想这不会发生在这次运行中,但我也会定期收到错误代码1001和1002。-1001代表nUrlErrorTimeDout
-1002代表nUrlErrorUnSupportedUrl
您可以检查其他错误代码,感谢您的澄清:)您知道为什么根据我的代码,“不受支持”会在随机时间出现吗?为什么请求会超时?当错误发生(并且我的应用程序崩溃)时,它是在刚刚调用代码之后发生的,并且根本没有明显的延迟。每当我关闭(输入后台)或打开(输入前台)我的应用程序时,我都会运行该功能(检索日期和时间)。谢谢你帮我理解!你能检查一下httpsResponse吗?.statusCode。在我的机器里,它工作得很好,我得到了200。太棒了,谢谢!我想不出它崩溃的任何可能原因(因为在应用程序的不同状态下发生的事情有点抽象)。。。但这是有道理的,并明确指出了一个可能的问题。我看看这是否管用。:)