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

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

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

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

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

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

    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 26.04.2018 05:21

@Malik Когда я получаю сообщение об ошибке 'nil', это происходит из строки 'if let contentType = httpsResponse! .AllHeaderFields ["Date"] as? String ', где что-то сказано о том, что заголовки равны нулю ?? К сожалению, я даже не совсем уверен, как дата вообще извлекается из Google, поэтому я не могу предложить больше информации ... Этот код по большей части был скопирован из другого ответа о переполнении стека. Я также иногда получаю коды ошибок 1001 и 1002 (я думаю, когда я получаю эту нулевую ошибку ... чего не было во время моей публикации).

Justin 26.04.2018 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
76
1

Ответы 1

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

NSURLErrorNotConnectedToInternet

Returned when a network resource was requested, but an internet connection is not established and cannot be established automatically, either through a lack of connectivity, or by the user's choice not to make a network connection automatically.

Хм, это кажется странным (поскольку мой Интернет очень силен, и я никогда не терял его ни на одном из своих устройств) ... Если я выйду из приложения, продолжая его запускать через Xcode, любые другие мои сетевые приложения по-прежнему будут работать. ..: / Я полагаю, что этого не произошло при этом прогоне, но я также периодически получаю коды ошибок 1001 и 1002.

Justin 26.04.2018 13:18

-1001 для NRURLErrorTimedOut -1002 для NRURLErrorUnsupportedURL Вы можете проверить другие коды ошибок ссылка здесь

Chanchal Chauhan 26.04.2018 13:30

Спасибо за разъяснение :) Вы случайно не знаете, почему "google.com" может быть "неподдерживаемым" в случайное время на основе моего кода? И почему время ожидания запроса истекло? Когда возникает ошибка (и мое приложение выходит из строя), это происходит после того, как ПРОСТО вызвал этот код, и никакой явной задержки нет. Я запускаю эту функцию (получение даты и времени) всякий раз, когда закрываю (перехожу в фоновый режим) или открываю (переход на передний план) свое приложение. Спасибо, что помогли мне понять!

Justin 26.04.2018 14:16

Можете проверить httpsResponse?.statusCode. На моей машине он работает нормально, и я получаю 200.

Chanchal Chauhan 26.04.2018 15:00

Я также получаю 200 за httpsResponse?.statusCode. Я обнаружил, что все эти ошибки возникают после этой процедуры: нажмите кнопку «Домой» (чтобы выйти из моего приложения) ... Она вызывает эту функцию, когда я это делаю ... а затем, если я жду слишком долго (около 10 секунд), чтобы снова открыть app (где функция вызывается снова) вылетает со всеми этими сетевыми ошибками? Вполне нормально, если я открою его в течение нескольких секунд ...

Justin 27.04.2018 02:51

Сделайте httpResponse необязательным. Это предотвращает сбой вашего приложения. httpsResponse?.allHeaderFields["Date"] as? String

Chanchal Chauhan 27.04.2018 07:40

Когда вы входите в фоновый режим и долго остаетесь, ваше приложение переходит в приостановленное состояние. Он приостанавливает все очереди отправки или очереди операций, выполняющие некритический код. Это причина того, что вы получаете ошибку http.

Chanchal Chauhan 27.04.2018 08:19

Огромное спасибо! Я не мог придумать никаких возможных причин, по которым он может вылетать (поскольку то, что происходит во время различных состояний приложения, немного абстрактно) ... Но это имеет смысл и ясно указывает на возможную проблему. Я посмотрю, поможет ли это. :)

Justin 27.04.2018 14:20

Другие вопросы по теме