URLSession.shared.dataTask vs dataTaskPublisher, quando usare quale?
Recentemente ho riscontrato due API per il recupero dei dati (download) che eseguono apparentemente la stessa cosa per me. Non riesco a vedere quando dovrei usarne uno sull'altro.
posso usare 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()
}
}
Oppure posso usare 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()
}
}
Non vedo le loro differenze distinte, poiché entrambi possono anche recuperare ed entrambi ci forniscono anche la possibilità di annullare facilmente le attività. Qualcuno può far luce sulle loro differenze in termini di quando usarli?
Risposte
Il primo è il classico. È presente da un po 'di tempo ormai e la maggior parte se non tutti gli sviluppatori lo conoscono.
Il secondo è un wrapper attorno al primo e consente di combinarlo con altri editori (es. Eseguire una richiesta solo quando sono state eseguite le prime due richieste). La combinazione di attività di dati utilizzando il primo approccio sarebbe molto più difficile.
Quindi, in sintesi: usa il primo per le richieste one-shot. Usa il secondo quando è necessaria più logica per combinare / passare risultati con / ad altri editori (non solo da URLSession). Questa è fondamentalmente l'idea alla base del framework Combine: è possibile combinare diversi modi di meccanismi asincroni (i datatasks che utilizzano i callback sono uno di questi).
Maggiori informazioni possono essere trovate nel video WWDC dello scorso anno sull'introduzione della mietitrebbia.