Я нашел этот другой вопрос здесь, в котором есть хорошая запись, однако он описывает, как использовать обработчики завершения в urlSession для перехода ... но мне было трудно применить его к моему сценарию.
Что я хочу сделать:
То, что я написал до сих пор в коде, работает ... иногда ... но не надежно. Я часто получаю сбой, и благодаря своим ограниченным знаниям я смог исследовать тот факт, что это может быть связано с продолжением задачи до того, как данные были фактически получены (иногда он говорит, что я искал, ноль ').
Вот часть, где я вызываю функцию для выполнения выборки:
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)
Я хочу убедиться, что смогу получить эти простые данные (дату и время), прежде чем продолжу работу со своим приложением, поэтому я ДЕЙСТВИТЕЛЬНО ценю вашу помощь в решении этой маленькой проблемы, поэтому я могу двигаться дальше с уверенностью :)
Огромное спасибо!
@Malik Когда я получаю сообщение об ошибке 'nil', это происходит из строки 'if let contentType = httpsResponse! .AllHeaderFields ["Date"] as? String ', где что-то сказано о том, что заголовки равны нулю ?? К сожалению, я даже не совсем уверен, как дата вообще извлекается из Google, поэтому я не могу предложить больше информации ... Этот код по большей части был скопирован из другого ответа о переполнении стека. Я также иногда получаю коды ошибок 1001 и 1002 (я думаю, когда я получаю эту нулевую ошибку ... чего не было во время моей публикации).





С вашим кодом все в порядке. Вы получаете сообщение об ошибке код -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.
-1001 для NRURLErrorTimedOut -1002 для NRURLErrorUnsupportedURL Вы можете проверить другие коды ошибок ссылка здесь
Спасибо за разъяснение :) Вы случайно не знаете, почему "google.com" может быть "неподдерживаемым" в случайное время на основе моего кода? И почему время ожидания запроса истекло? Когда возникает ошибка (и мое приложение выходит из строя), это происходит после того, как ПРОСТО вызвал этот код, и никакой явной задержки нет. Я запускаю эту функцию (получение даты и времени) всякий раз, когда закрываю (перехожу в фоновый режим) или открываю (переход на передний план) свое приложение. Спасибо, что помогли мне понять!
Можете проверить httpsResponse?.statusCode. На моей машине он работает нормально, и я получаю 200.
Я также получаю 200 за httpsResponse?.statusCode. Я обнаружил, что все эти ошибки возникают после этой процедуры: нажмите кнопку «Домой» (чтобы выйти из моего приложения) ... Она вызывает эту функцию, когда я это делаю ... а затем, если я жду слишком долго (около 10 секунд), чтобы снова открыть app (где функция вызывается снова) вылетает со всеми этими сетевыми ошибками? Вполне нормально, если я открою его в течение нескольких секунд ...
Сделайте httpResponse необязательным. Это предотвращает сбой вашего приложения. httpsResponse?.allHeaderFields["Date"] as? String
Когда вы входите в фоновый режим и долго остаетесь, ваше приложение переходит в приостановленное состояние. Он приостанавливает все очереди отправки или очереди операций, выполняющие некритический код. Это причина того, что вы получаете ошибку http.
Огромное спасибо! Я не мог придумать никаких возможных причин, по которым он может вылетать (поскольку то, что происходит во время различных состояний приложения, немного абстрактно) ... Но это имеет смысл и ясно указывает на возможную проблему. Я посмотрю, поможет ли это. :)
На какой строке вы получаете ошибку
nil?