Я в основном получаю новостные статьи от 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. Любая помощь будет оценена!