URLSession.shared.dataTask vs dataTaskPublisher, ¿cuándo usar cuál?
Recientemente encontré dos API de recuperación de datos (descarga) que aparentemente realizan lo mismo para mí. No veo cuándo debería usar uno sobre el otro.
Puedo usar 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()
}
}
O puedo usar 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()
}
}
No veo sus diferencias distintivas, ya que ambos también pueden recuperar, y ambos también nos brindan la capacidad de cancelar las tareas fácilmente. ¿Alguien puede arrojar algo de luz sobre sus diferencias en términos de cuándo usar cuál?
Respuestas
El primero es el clásico. Ha estado presente durante bastante tiempo y la mayoría, si no todos los desarrolladores, están familiarizados con él.
El segundo es un envoltorio alrededor del primero y permite combinarlo con otros editores (por ejemplo, realizar alguna solicitud solo cuando se realizaron las dos primeras solicitudes). La combinación de tareas de datos utilizando el primer enfoque sería mucho más difícil.
Entonces, en resumen: use el primero para solicitudes únicas. Use el segundo cuando se necesite más lógica para combinar / pasar resultados con / a otros editores (no solo desde URLSession). Esta es, básicamente, la idea detrás del marco Combine: puede combinar diferentes formas de mecanismos asíncronos (las tareas de datos que utilizan devoluciones de llamada son una de ellas).
Se puede encontrar más información en el video de la WWDC del año pasado sobre la introducción de la cosechadora.