URLSession.shared.dataTask vs dataTaskPublisher, quand utiliser lequel?
J'ai récemment rencontré deux API de récupération de données (téléchargement) qui effectuent apparemment la même chose pour moi. Je ne vois pas quand devrais-je utiliser l'un sur l'autre.
je peux utiliser URLSession.shared.dataTask
var tasks: [URLSessionDataTask] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
let task = URLSession.shared.dataTask(with: tuple.imageURL, completionHandler :
{ data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() { [weak self] in
self?.displayFlag(data: data, title: tuple.name)
}
})
tasks.append(task)
task.resume()
}
deinit {
tasks.forEach {
$0.cancel()
}
}
Ou je peux utiliser URLSession.shared.dataTaskPublisher
var cancellables: [AnyCancellable] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
URLSession.shared.dataTaskPublisher(for: tuple.imageURL)
.sink(
receiveCompletion: {
completion in
switch completion {
case .finished:
break
case .failure( _):
return
}},
receiveValue: { data, _ in DispatchQueue.main.async { [weak self] in self?.displayFlag(data: data, title: tuple.name) } })
.store(in: &cancellables)
}
deinit {
cancellables.forEach {
$0.cancel()
}
}
Je ne vois pas leurs différences distinctes, car les deux peuvent également être récupérés et les deux nous permettent également d'annuler facilement les tâches. Quelqu'un peut-il faire la lumière sur leurs différences en termes de quand utiliser lequel?
Réponses
Le premier est le classique. Il est présent depuis un certain temps maintenant et la plupart sinon tous les développeurs le connaissent.
Le second est un wrapper autour du premier et permet de le combiner avec d'autres éditeurs (par exemple, exécuter une requête uniquement lorsque les deux premières requêtes ont été effectuées). La combinaison des tâches de données utilisant la première approche serait beaucoup plus difficile.
Donc, en un mot: utilisez le premier pour les demandes ponctuelles. Utilisez le second lorsque plus de logique est nécessaire pour combiner / transmettre les résultats avec / à d'autres éditeurs (pas seulement depuis URLSession). C'est, fondamentalement, l'idée derrière Combine Framework - vous pouvez combiner différentes manières de mécanismes asynchrones (les datatasks utilisant des callbacks en font partie).
Plus d'informations peuvent être trouvées dans la vidéo de la WWDC de l'année dernière sur l'introduction de la moissonneuse-batteuse.