FetchJson прекратил работу без причины - PullRequest
0 голосов
/ 07 мая 2019

Я получаю данные из API новостей. Все работало как 40 с лишним раз, потом что-то случилось, и ничего не работало После того, как я включил Mac на следующий день, он работал несколько раз, а теперь снова нет, я не знаю, почему это так. пожалуйста, помогите, код ниже:

Я попытался переустановить XCode, управлять списком, переписать проект.

struct Model: Codable {
    let articles: [News]
}

struct Source: Codable {
    var name: String?
    var id: String?
}

struct News: Codable {
    var title: String?
    var url: String
    var description: String
    var urlToImage: URL?
    var source: Source
    var publishedAt: String?
    var author: String?
    var content: String?
}


class myData {
    static func getData(completion: @escaping ([News]) -> ()) {
        DispatchQueue.global(qos: .userInteractive).async {
            var finalData = [News]()

            let jsonUrlString = "https://newsapi.org/v2/top-headlines?country=ua&apiKey=0cff1368c1d1445d9a0bccb6063a5220"
            if let url = URL(string: jsonUrlString) {
                if let data = try? Data(contentsOf: url) {

                    let decoder = JSONDecoder()
                    if let jsonPetitions = try? decoder.decode(Model.self, from: data) {
                        finalData = jsonPetitions.articles
                    }
                }
            }
            DispatchQueue.main.async {
                completion(finalData)
            }
        }
    }
}

мой код перезагружает tableView, и каждый раз он становится пустым. это должно выглядеть как простой JSON.

1 Ответ

0 голосов
/ 07 мая 2019

У вас ошибка декодирования. Это будет легко вывести, если вы поймаете ошибку декодирования. Свойство description является пустым для одного из источников новостей в вашем ответе. Просто сделай это Optional.

Попробуйте это:

struct Model: Codable {
    let articles: [News]
}

struct Source: Codable {
    var name: String?
    var id: String?
}

struct News: Codable {
    var title: String?
    var url: String
    var description: String?
    var urlToImage: String?
    var source: Source
    var publishedAt: String?
    var author: String?
    var content: String?
}


class MyData {
    static func getData(completion: @escaping ([News]) -> ()) {
        DispatchQueue.global(qos: .userInteractive).async {
            var finalData = [News]()

            let jsonUrlString = "https://newsapi.org/v2/top-headlines?country=ua&apiKey=0cff1368c1d1445d9a0bccb6063a5220"
            if let url = URL(string: jsonUrlString) {

                do {
                    let data = try? Data(contentsOf: url)

                    let decoder = JSONDecoder()
                    let jsonPetitions = try decoder.decode(Model.self, from: data!)
                    finalData = jsonPetitions.articles
                } catch {
                    print(error)
                }


            }
            DispatchQueue.main.async {
                completion(finalData)
            }
        }
    }
}

MyData.getData { (news) in
    print(news)
}
...