在 Swift 中,如何在继续编写代码之前安全地确保从 Google 检索数据(日期和时间)?
Posted
技术标签:
【中文标题】在 Swift 中,如何在继续编写代码之前安全地确保从 Google 检索数据(日期和时间)?【英文标题】:In Swift, How Can I Safely Ensure Data is Retrieved (Date & Time) from Google Before Continuing Code? 【发布时间】:2018-04-26 01:13:12 【问题描述】:我发现了另一个问题here,它的文章写得很好,但是它描述了如何在 urlSession 中使用完成处理程序以进行分离……但我很难将它应用到我的案例场景中.
我想做的事:
-
在 google 的服务器上以“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
(lldb)
我想确保在继续使用我的应用程序之前能够检索到这个简单的数据(日期和时间),所以我真的很感谢你在解决这个小问题方面的帮助,所以我可以放心地继续前进 :)
非常感谢!
【问题讨论】:
哪一行出现nil
错误?
@Malik 当我收到'nil'错误时,它来自'if let contentType = httpsResponse!.allHeaderFields["Date"] as? String',它在哪里说标题为零?可悲的是,我什至不完全确定日期是如何从谷歌检索到的,所以我无法提供更多的见解......这段代码大部分是从另一个堆栈溢出答案复制而来的。我有时也会收到错误代码 1001 和 1002(我想当我收到那个 nil 错误时......这在我发帖时没有发生)。
【参考方案1】:
您的代码没有问题。您收到错误code -1009,这意味着您的互联网连接未建立。
NSURLErrorNotConnectedToInternet
在请求网络资源但未建立 Internet 连接且无法自动建立时返回,原因可能是缺少连接,或者是用户选择不自动建立网络连接。
【讨论】:
嗯,这看起来很奇怪(因为我的互联网非常强大,而且我从未在任何设备上丢失过它)...如果我退出应用程序同时仍然通过 Xcode 运行它,我的任何其他依赖网络的应用程序仍然可以工作......:/我想这在这次运行中没有发生,但我也会定期收到错误代码 1001 和 1002。 -1001 为NRURLErrorTimedOut
-1002 为NRURLErrorUnsupportedURL
您可以查看其他错误代码link Here
感谢您的澄清 :) 您是否知道为什么“google.com”会根据我的代码随机“不受支持”?为什么请求会超时?当错误发生(并且我的应用程序崩溃)时,它只是在调用该代码之后并且根本没有明显的延迟。每当我关闭(进入后台)或打开(进入前台)我的应用程序时,我都会运行该功能(检索日期和时间)。感谢您帮助我理解!
你能检查一下httpsResponse?.statusCode
。在我的机器上,它工作正常,我得到了 200 个。
非常感谢!我想不出它会崩溃的任何可能原因(因为在应用程序的不同状态期间发生的事情有点抽象)......但这很有意义并且清楚地指出了一个可能的问题。我会看看这是否能解决问题。 :)以上是关于在 Swift 中,如何在继续编写代码之前安全地确保从 Google 检索数据(日期和时间)?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue
在 Swift 中,如何让其他应用在我的应用打开时继续播放音频?
如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?