URLSession.shared.dataTask возвращает ноль байтов - PullRequest
0 голосов
/ 27 ноября 2018

Моя цель - вызвать службу http, которая возвращает json для анализа в виде массива объектов NewsModel.

Я определил такую ​​структуру

struct NewsModel: Decodable {
    var id: Int
    var title: String
    var content: String
} 

и написал этот методв Service.swift class:

func getNews(pageSize: Int, pageCount: Int, completion: @escaping ([NewsModel]?) -> ()) {

        guard let url = URL(string: "\(Service.baseURLSSMService)/news?pageSize=\(pageSize)&pageCount=\(pageCount)") else {return}

        var retVal = [NewsModel]()

        // Create URLRequest
        var request = URLRequest(url: url)
        // Set headers and http method
        request.httpMethod = "GET"
        request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            guard let dataResponse = data,
                error == nil else {
                    print(error?.localizedDescription ?? "Response Error")
                    completion(nil)
                    return }
            do{                
                    print("RESPONSE:\(response.debugDescription)")
                    retVal = try
                        JSONDecoder().decode([NewsModel].self, from: dataResponse)
                    completion(retVal)

            } catch let parsingError {
                print("Error", parsingError)
                completion(nil)
            }

        }
        task.resume()
    }

Мне нужно вызвать этот метод из моего HomeViewController .Я использовал этот код в моем viewDidLoad:

Service.sharedInstance.getNews(pageSize: 10, pageCount: 1) { (news) in

            // I need the first element of the news array   
            // I save it into a global variable 
            self.homeNews = news?.first

            DispatchQueue.main.async {
                if self.homeNews != nil {
                    self.myLabel.text = self.homeNews?.title
                }
                else {
                    self.myLabel.text = "No data received."    
                }
            }
        }

Когда я запускаю код, всегда случается, что функция getNews возвращает 0 байтов, поэтому JSONDecoder ничего не может проанализировать.Это сообщение об ошибке:

Ошибка dataCorrupted (Swift.DecodingError.Context (codingPath: [], debugDescription: «Указанные данные не являются допустимыми в формате JSON.», UnderError: Необязательно (Ошибка домена = NSCocoaErrorDomain)Код = 3840 «Нет значения.» UserInfo = {NSDebugDescription = Нет значения.})))

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

РЕДАКТИРОВАТЬ 1 :

Это пример json:

[
  {
    "id": 2048,
    "title": "title-sample-1",
    "content": "content-sample-1"
  },
  {
    "id": 2047,
    "title": "title-sample-2",
    "content": "content-sample-2"
  }
]

РЕДАКТИРОВАТЬ 2 :

Вот ответ.debugDescription

RESPONSE:Optional(<NSHTTPURLResponse: 0x2830a1160> { URL: http://.../news?pageSize=1&pageCount=1 } { Status Code: 400, Headers {
    Connection =     (
        close
    );
    Date =     (
        "Tue, 27 Nov 2018 15:38:38 GMT"
    );
    "Transfer-Encoding" =     (
        Identity
    ); } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...