- вызов функции с завершением URLRequest - JSON - PullRequest
0 голосов
/ 10 февраля 2019

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

Это код от Дэвида Трана.Привет делает замечательные учебники, но в коде нет вызова этой функции.

let request: URLRequest
lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default
lazy var session: URLSession = URLSession(configuration: self.configuration)

typealias JSONHandler = (JSON?, HTTPURLResponse?, Error?) -> Void

func downloadJSON(completion: @escaping JSONHandler)
{
    let dataTask = session.dataTask(with: self.request) { (data, response, error) in
        // OFF THE MAIN THREAD
        // Error: missing http response
        guard let httpResponse = response as? HTTPURLResponse else {
            let userInfo = [NSLocalizedDescriptionKey : NSLocalizedString("Missing HTTP Response", comment: "")]
            let error = NSError(domain: DANetworkingErrorDomain, code: MissingHTTPResponseError, userInfo: userInfo)
            completion(nil, nil, error as Error)
            return
        }

        if data == nil {
            if let error = error {
                completion(nil, httpResponse, error)
            }
        } else {
            switch httpResponse.statusCode {
            case 200:
                // OK parse JSON into Foundation objects (array, dictionary..)
                do {
                    let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]
                    completion(json, httpResponse, nil)
                } catch let error as NSError {
                    completion(nil, httpResponse, error)
                }
            default:
                print("Received HTTP response code: \(httpResponse.statusCode) - was not handled in NetworkProcessing.swift")
            }
        }
    }

    dataTask.resume()
}

1 Ответ

0 голосов
/ 10 февраля 2019

Пусть Xcode поможет вам.Введите downlo и нажмите клавишу возврата.XCode завершает функцию

enter image description here

Снова нажмите клавишу возврата, и вы получите параметры

enter image description here

Вам необходимо заменить заполнители именами параметров, например

downloadJSON { (json, response, error) in
     if let error = error {
         print(error)
     } else if let json = json {
         print(json)
     }
}

Примечание:

В вашем коде есть фатальная ошибка несоответствия типов: Результат JSONSerializationстрока [String:Any], но первый параметр обработчика завершения - JSON

...