В Swift, Как я могу безопасно убедиться, что данные получены (дата и время) из Google перед продолжением кода? - PullRequest
0 голосов
/ 26 апреля 2018

Я нашел этот другой вопрос здесь , у которого хорошая запись, однако он описывает, как использовать обработчики завершения в сеансе urlSession для перехода ... но мне было трудно применить егов моем случае.

Что я хочу сделать:

  1. Посмотрите текущую дату и время в формате UTC на серверах Google.
  2. Убедитесь, что я получил данные, прежде чем продолжить
  3. Сохраните эти восстановленные данные (дату и время) в строковой переменной.

То, что я написал до сих пор в коде, работает... иногда ... но это не надежно.Я часто получаю сбои, и из-за моих ограниченных знаний я смог исследовать тот факт, что это может иметь отношение к задаче, продолжающейся до того, как данные будут фактически извлечены (иногда это говорит о том, что я искал "nil ').

Вот часть, где я вызываю функцию для извлечения:

    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)

Я хочу убедиться, что могу получить эти простые данные (ДатаИ время) прежде чем я продолжу работу над своим приложением, поэтому я ДЕЙСТВИТЕЛЬНО благодарен за помощь в решении этой небольшой проблемы, поэтому я могу уверенно двигаться дальше:)

Большое спасибо!

1 Ответ

0 голосов
/ 26 апреля 2018

Нет ничего плохого в вашем коде.Вы получаете сообщение об ошибке код -1009 , означающее, что ваше интернет-соединение не установлено.

NSURLErrorNotConnectedToInternet

Возвращается при запросе сетевого ресурса, но при интернет-соединениине установлен и не может быть установлен автоматически, либо из-за отсутствия соединения, либо по выбору пользователя не устанавливать сетевое соединение автоматически.

...