2014-06-09 6 views
9

Ho iniziato un progetto per NetworkCommunication. Avevo un design in cui le sottoclassi NSOperation creano e gestiscono il proprio NSURLConnection. La sottoclasse NSOperation viene creata un'istanza da una classe NetworkManger che la aggiunge allo NSOperationQueue. Una volta terminata la richiesta, verrà chiamato il delegato (ad esempio: ViewController). Questo è il flusso:Sostituzione di NSURLConnection con NSURLSession

Network Manger crea una sottoclasse NSOperation (che incapsula URL, parametri, ecc.) E la aggiunge a NSOperationQueue. NSOperation sottoclasse istanzia NSURLConnection (che svolge asynchronous richiesta e recupera dati) NSURLConnection discariche dati NSOperation sottoclasse NSOperation sottoclasse esegue il blocco completamento fornita dal delegato (controller della vista). Sto cercando di implementare lo stesso modello con NSURLSession ora. Voglio essere in grado di incapsulare l'url e i parametri richiesti per fare una richiesta di rete all'interno di un singolo oggetto.

Va bene se uso lo stesso modello se utilizzo NSURLSession. Ho controllato le classi AFNetworking. Ma, non hanno sottoclassato NSOperation per NSURLSession. E, inoltre, dove dovrebbe andare l'oggetto della sessione. Farà parte della classe NSOperation.

Qualcuno può dare qualche consiglio esperto su questo. Dovrei essere in grado di cancellare richieste, fare upload (POST/PUT), scaricare dati. La classe Network Manager sarebbe l'unico punto di contatto per qualsiasi richiesta di rete.

+0

@Bhavesh Nai, per favore non aggiungere 'grazie in anticipo' o altri saluti alla fine delle tue modifiche, sono considerati 'rumore' http://meta.stackexchange.com/questions/2950/should-hi -thanks-taglines-and-salutations-be-removed-from-posts –

+0

Scusa @ SeanO'Toole –

+0

Qualcuno può rispondere a questa domanda, ma non solo al solo editing. Non ci sono esperti iOS qui? PLs help – user694688

risposta

17

Aggiornamento:

NSURLConnection è deprecato efficace Mac OS e iOS 10.11 9. Quindi, a questo punto NSURLSession dovrebbe essere usato al posto di NSURLConnection. Come l'intestazione NSURLConnection.h dice:

Deprecated: La classe NSURLConnection non dovrebbe più essere utilizzato. NSURLSession sostituisce NSURLConnection.

La mia risposta originale è qui sotto.


La risposta dipende dal fatto che è necessario la ricchezza dei vari metodi NSURLSession delegato o meno. Se stai bene usando le rendering dei blocchi di completamento (cioè senza richiamate di avanzamento, senza streaming, ecc.), La conversione da NSURLConnection a NSURLSession è piuttosto banale. Basta inserire l'istanza NSURLSession nella classe NetworkManager e quindi eseguire il wrapping delle istanze basate su delegato NSURLSessionTask in una sottoclasse simultanea NSOperation e il gioco è fatto. Basta adottare lo schema di sottoclasse standard asincrono/simultaneo NSOperation.

Se si utilizzano le rappresentazioni basate su delegati di NSURLSession, si tratta di un intero assortimento di pesci. La seccatura principale è che i vari metodi di delegazione NSURLSessionTask vengono chiamati nella sessione delegate anziché in un oggetto delegato all'attività. A prima vista, questo potrebbe sembrare un problema banale, ma se le istanze di operazione hanno blocchi di completamento/progresso univoci, ad esempio, rimani bloccato dal modo in cui l'oggetto di sessione esegue il mapping di questi callback del metodo delegato all'individuo istanze di operazione di richiesta originale.

Per risolvere questo problema, è necessario mantenere una mappatura degli identificatori di attività sugli oggetti della sottoclasse NSOperation. È quindi possibile implementare questi metodi di delega NSURLSessionTask (inclusi attività, attività di download e attività di caricamento) nella rispettiva sottoclasse NSOperation. La classe di gestore di rete NSURLSession può quindi, quando riceve una chiamata delegata NSURLSessionTask, utilizzare l'identificativo di attività per identificare l'istanza appropriata NSOperation e quindi chiamare il metodo di delegato appropriato lì.

Infine, se si intende gestire le istanze di sfondo NSURLSession, la vita diventa ancora più difficile (perché le attività in background continueranno anche dopo che l'app è stata chiusa e tutti i suoi oggetti sono stati scartati). Le sessioni in background semplicemente non si prestano ad un approccio basato su NSOperation.

Bottom line, questo è banale se avete solo bisogno del blocco di completamento NSURLSession metodi, ma è un po 'una seccatura se avete bisogno della resa basata sui delegati.

+1

Grazie Rob. Questa è la mia comprensione ora: se stiamo andando per un approccio basato su blocchi, NSOperation va bene. Ma se stiamo andando per un approccio basato sui delegati, allora dobbiamo gestire i compiti. Il mio dubbio è: se ho la sottoclasse NSOperation implementare i metodi di delega a livello di attività, qual è il problema. Per favore, spiega. Non capisco. – user694688

+1

@ user694688 Non sto dicendo che non si possa usare un approccio basato sulle operazioni per 'NSURLSession' basato sui delegati, ma piuttosto semplicemente che richiede più lavoro. – Rob

+3

Ad esempio, supponiamo di avere due richieste di rete, avvolte nelle loro operazioni, una che sta scaricando un'immagine e una che richiede JSON. Quando 'NSURLSession' ha un suo delegato chiamato per i metodi delegate delle attività, come fa a sapere per quale operazione (l'immagine o il JSON) è chiamata quella chiamata? Ci sono due approcci logici: uno è quello di avere una sessione separata per ogni operazione (che sembra architettonicamente inelegante). L'altro consiste nel fare in modo che l'istanza di sessione comune mantenga una mappatura di quale identificatore di attività appartiene a quale operazione. – Rob