在 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 中使用宏?

Swift - 在继续之前等待“dataTaskWithRequest”响应

Swift 4 中不确定代码块的 Try-catch 功能

如何从 swift 代码中应用 firebase 数据库安全规则