JSON сетевой вызов API не возвращает надежное количество данных каждый раз, когда я звоню (Swift) - PullRequest
0 голосов
/ 16 марта 2020

Я в основном получаю новостные статьи от newsapi.org. У меня есть массив источников (который пользователь может выбрать из) и затем создающий для l oop, где он перебирает источники и делает вызов серверу.

func fetchForYouArticles(sources: [NewsSource : Bool], completion: @escaping ([Articles]) -> ()) {
    var sourcesArray: [String] = []


    for source in sources.keys {
        sourcesArray.append(source.id)
    }

    //Fetched Sources Articles
    var fetchedArticles: [Articles] = []
    // Fetch articles from each source 

    for (index, s) in sourcesArray.enumerated() {
        guard let url = URL(string: "http://newsapi.org/v2/top-headlines?sources=\(s)&apiKey=\(NetworkProperties.APIKEY)") else {
            fatalError()
        }
        let urlRequest = URLRequest(url: url)
          URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
                guard let data = data else { return }
            do {
                 let sourcesList = try JSONDecoder().decode(ArticleList.self, from: data)

                fetchedArticles.append(contentsOf: sourcesList.articles)
                 print(sourcesList.articles)
                if index == (sourcesArray.count - 1) {
                     completion(fetchedArticles)
                }
            } catch {
                print(error)
            }

        }.resume()

   }      
}

Здесь происходит то, что я перебираю все источники, а затем добавляю источники в URL и извлекаю данные. Затем я добавляю все выбранные статьи в новый массив с именем fetchedArticles. Затем я проверяю, равен ли индекс для l oop итоговому значению - 1, и в этом случае я вызываю обработчик завершения.

Проблема в том, что я не получаю достоверное количество статей каждый раз для одного и того же количества источников. Иногда я получаю 30 из 40 возможных статей. В других случаях я получу все 40. Иногда после этого оператора вызывается строка print(sourcesList.articles):

if index == (sourcesArray.count - 1) {
       completion(fetchedArticles)
 }

Я вызываю эту функцию в viewWillAppear моего collectionViewController. Любая помощь будет оценена!

...