URLSession.shared.dataTask vs dataTaskPublisher, quando usare quale?

Oct 23 2020

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

5 Eimantas Oct 23 2020 at 12:42

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.