Вызов завершения Handler при возникновении ошибки

Я пытаюсь передать bool моему обработчику завершения. Когда приложение работает, результат передачи bool моему обработчику завершения определяет, какое предупреждение я отображаю. Если я вызываю его во время проверки ошибок, приложение вылетает / блокируется. Если я позвоню куда-нибудь еще, все работает как положено? Я заблудился и не могу найти ответ на этот вопрос. Пожалуйста помоги.

class func TestConnection(_ urlBase: String, usingCommand command: String, completionHandler: @escaping (Bool) -> Void) {
        let urlString = urlBase + "/" + command
        var IsValidConnection = false
        guard let url = URL(string: urlString) else {
            completionHandler(IsValidConnection)
            return
        }

        URLSession.shared.dataTask(with: url) { (data, response, error) in      
            //App blows up when running this block of code.
            //Doesn't return. App crashes/locks up
            guard error == nil else {
                completionHandler(false)
                return
            }
            //App works as expected when running code below
            guard let _: HTTPURLResponse = response as? HTTPURLResponse else {
                completionHandler(false)
                return
            }

            let serverResponse = response as! HTTPURLResponse

            if serverResponse.statusCode == 200 {
                IsValidConnection = true
            }

            completionHandler(IsValidConnection)

        }.resume()
    }

1 ответ

Решение

Проблема в URLSession.shared.dataTask имеет свой completionHandler названный completionHandler, Просто переименуйте ваш обработчик в testConnectionCompletionHandler:

class func TestConnection(_ urlBase: String, usingCommand command: String, testConnectionCompletionHandler: @escaping (Bool) -> Void) {
    let urlString = urlBase + "/" + command
    var IsValidConnection = false
    guard let url = URL(string: urlString) else {
        testConnectionCompletionHandler(IsValidConnection)
        return
    }

    URLSession.shared.dataTask(with: url) { (data, response, error) in      
        //App blows up when running this block of code.
        //Doesn't return. App crashes/locks up
        guard error == nil else {
            testConnectionCompletionHandler(false)
            return
        }
        //App works as expected when running code below
        guard let _: HTTPURLResponse = response as? HTTPURLResponse else {
            testConnectionCompletionHandler(false)
            return
        }

        let serverResponse = response as! HTTPURLResponse

        if serverResponse.statusCode == 200 {
            IsValidConnection = true
        }

        testConnectionCompletionHandler(IsValidConnection)

    }.resume()
}

Дополнительная информация: https://developer.apple.com/documentation/foundation/urlsession/1407613-datatask

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