Trasferimento dati tra View Controllers

Parliamo del motivo e del modo in cui si usa NSNotification per trasferire dati e far interagire classi e struct. A proposito, NSNotification – nonostante il nome – non ha nulla a che fare con Push Notification. Errore da dilettanti. Ci sono passato.

Sì, esistono diversi metodi per trasferire dati in Swift: Delegate, Key-Value Observing, Segue, NSNotification, Target-Action, Callbacks. Ognuno di questi presenta i suoi vantaggi e i suoi svantaggi. Possiamo paragonare questi strumenti alle posate: ognuna ha il suo scopo specifico e non potremmo mai utilizzare delle bacchette cinesi per consumare una zuppa.

Preferisco dedicarmi ad un metodo per volta – e in questo articolo vi spiegherò perché non si dovrebbe usare un cucchiaio per tagliare una bistecca.

Cosa imparerete in questa guida

In questo tutorial imparerete due cose. In primo luogo, scoprirete come “notificare” un altro View Controller o passare da un singolo View Controller; infine farete tesoro del potere di NSNotification… e delle sue debolezze.

UI Component

Ci sono due View Controller. FirstVC e SecondVC. Do per scontato che sapete già integrare UINavigationController e connettere IBOutlets e IBAction, ecc.

SecondVC notificherà FirstVC. Con “notificare” mi riferisco ad una sorta di poke: non trasferiremo dati – anche se possiamo (spiegherò più avanti come). L’esempio qui sotto è analogo alla situazione di un utente che aggiorna il suo profilo su Facebook o Instagram. Non uso UITableView perché sarebbe eccessivo per spiegare il concetto.

Prima di andare al sodo, immaginiamo due View Controller come una coppia ben assortita. Entrambi hanno degli smartphone (NSNotification Objects) per comunicare tra loro; ogni smartphone ha due features: ricevere ed inviare dati. Infine, per localizzare il dispositivo dell’altro, entrambi dispongono di una chiave segreta comune. In ogni caso, sta ad ognuno di loro scegliere se accettare o rifiutare la chiamata.

Ora abbiamo un’idea generale sul loro modo di comunicare. È arrivato il momento di tuffarci in Swift 🙌🏼

Per prima cosa andiamo prendere la chiave segreta. Si può creare un file Swift separato o semplicemente crearne uno al di fuori di ogni View Controller, così:

myNotificationKey verrà usato per connettere i due smartphone. Ovviamente – come per tutte le altre coppie – si può disporre di un’altra chiave per altri scopi 😈

Andiamo a collegare uno smartphone. Chiamiamolo observer.

L’observer avrà quattro parametri. Sarà chiesto ad Observer quale sarà self, dal momento che si collega lo smartphone a SecondVC. Secondo, Selector, che entra in funzione quando si notifica. Terzo, name, si riferisce al codice segreto. Infine, object, sul quale mi soffermerò dopo. Per ora usiamo nil.

Non capisco il significato della proprietà di tipo “default” perché non c’è alcuna descrizione nelle linee guida API. Dice,

“No overview available” — Apple

In ogni caso, SecondVC ha uno smartphone/observer ed è ora di inviare/notificare quando il pulsante viene premuto.

In tal contesto, object si riferisce al mittente. Dal momento che SecondVC notifica se stesso, è self.

FirstVC non ha ancora registrato un observer, quindi il poke non lo toccherà. Come accennato prima, il partner ha il diritto di rispondere o di ignorare. In iOS, chiamiamo questa circostanza “loose coupling”. Non c’è un legame vincolante, a differenza del trasferimento di dati tra View Controller usando delegate/protocol. So che alcuni di voi sono confusi. Ho in programma un articolo sul trasferimento di dati con delegate – e inoltre parlerò di delegate vs. NSNotification.

Risorse

Pass Data between ViewControllers in Swift 3 without Segue (YouTube)

Ricevere

FirstVC è alquanto semplice. Aggiungerà uno smartphone e ascolterà la notifica nel caso in cui abbia lo stesso codice segreto.

Ora parliamo di object, uno dei parametri che ho saltato prima. Se è nil, non importerà dove o quali dati vengono inviati, poiché abbiamo la chiave segreta. Non ho mai usano nulla a parte nil, quindi chi ha maggiore esperienza al riguardo può aiutarmi.

Questo dovrebbe essere il risultato:

A proposito, immaginate SecondVC come Facebook Live. Finché ci sono molti altri View Controller contenti observer che “ascoltano” la chiave segreta sarà possibile notificare molte persone. Tuttavia, ciò avviene in sincrono. Tutte le altre attività saranno bloccate fino al momento in cui il task sarà terminato, quindi rallenterà i dispositivi con troppi View Controller. Non so quanti VC corrispondano a troppi VC.

Fonte codice

Github

Traferire dati

Ora che abbiamo imparato a notificare, passiamo velocemente all’invio di dati durante la notifica. È qui che avviene la magia.

Nel SecondVC, invece di utilizzare il buon vecchio metodo

è possibile inviare un richiamo contenente un dizionario

Nel FirstVC, sotto viewDidLoad, inseriremo questo:

Non parlerò di queue. Se inserite nil il task avviene in sincrono. In altre parole, se non è nil, FirstVC può ricevere dati usando Grand Central Dispatch. Se non conoscete GCD non c’è nulla di cui preoccuparsi. Ho pubblicato due articoli per chiarire il concetto.

Risorse

Intro to Grand Central Dispatch in Swift 3 (Medium)
UI & Networking like a Boss in Swift 3 (Medium)

Avete notato qualcosa di diverso. Esatto. catchNotification eliminerà il richiamo contenente userInfo! Apparirà in questo modo:

Appena il pulsante di SecondVC viene premuto, catchNotification si esegue in automatico e contiene userInfo passato da SecondVC. Se non sapete come fare l’unwrap degli optionals utilizzando Guard, date un’occhiata al mio tutorial qui sotto.

Risorse

Guard Statement (YouTube)

Infine, dovrebbe apparire così:

Risorse

Source Code

Rimozione Observer/Smartphone

Se volete rimuovere un observer quando la View viene abbandonata, inserite semplicemente il seguente codice nel FirstVC o in qualsiasi altro View Controller.

***

Bob Lee è l’autore di questo articolo.

Articolo originale: Pass Data with NSNotification in Swift 3

 

NO COMMENTS

LEAVE A REPLY