Моя цель - вызвать службу 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
); } })