MVC e delega

7

Sono un programmatore iOS principiante e uso il modello Model-View-Controller come modello di progettazione: il mio modello non sa nulla della mia vista (per renderla compatibile con qualsiasi vista), la mia vista non sapere qualcosa sul mio modello in modo che interagiscano tramite il mio controller. Un modo molto usuale per una vista di interagire con il controller è attraverso la delega: quando l'utente interagisce con l'app, la mia vista notificherà il mio controller, che può chiamare alcuni metodi del mio modello e aggiornare la mia vista, se necessario.

Tuttavia, avrebbe senso rendere il mio controller il delegato del mio modello? Non sono convinto che questa sia la strada da percorrere. Potrebbe essere utile che il mio modello comunichi al mio controllore che alcuni processi siano finiti, per esempio, o per chiedere un input extra dell'utente se non ha abbastanza informazioni per completare l'operazione. Il lato negativo di questo, però, è che il mio controller sarebbe il delegato sia per il mio controller che per il mio modello, quindi non ci sarebbe davvero un modo corretto per notificare il mio modello di modifiche nella mia vista, e viceversa. (correggimi se sbaglio.)

Conclusione: non penso davvero che sia una buona idea avere il mio controller come delegato del mio modello, ma il fatto di essere il delegato della mia opinione andrebbe bene. È così che la maggior parte dei modelli MVC è gestita? O c'è un modo per avere il controller come delegato sia del controller che del modello, con una corretta comunicazione tra loro?

Come ho detto, sono un principiante, quindi voglio fare queste cose nel modo giusto immediatamente, piuttosto che spendere un sacco di ore su modelli che non funzioneranno comunque. :)

    
posta Tim Vermeulen 14.10.2012 - 23:27
fonte

2 risposte

4

Parlerò specificamente a iOS in quanto ha i suoi concetti e alcune caratteristiche del linguaggio rendono il suo modo di fare le cose bene. Spesso in iOS le interazioni tra i livelli del Controller e del modello si basano su alcune varianti del pattern Observer (KVO), ma anche NSNotification ). Trovo che il livello del modello spesso non si impegni nello stesso tipo di back e forth interattivo che avviene nell'interfaccia del livello View - Controller (si pensi alla complessità di una vista tabella dinamica e completa), quindi la delega non è la più naturale in forma. Solitamente qualcosa (input dell'utente, richiesta di rete, ecc.) Cambia il modello e il controller risponde di conseguenza aggiornando la vista. Tuttavia, la delega viene ancora utilizzata in interazioni dinamiche di lunga durata, come una vista tabella che visualizza il contenuto di un set di dati di aggiornamento frequente (vedere NSFetchedResultsController ).

Per quanto riguarda la tua domanda di avere il controller come delegato della tua vista e del tuo modello, non c'è nessun problema intrinseco se non quello di degradare la coesione del controller, e a volte diventa una buona scelta per dividere il controller in guarda controller e controller di dati. L'uso di KVO o NSNotification per osservare i cambiamenti nel livello del modello è di solito abbastanza semplice da non farti trovare la necessità di estrarre una nuova classe.

    
risposta data 15.10.2012 - 01:35
fonte
1

Quando parli di controller rispetto a iOS, parli spesso di controller di visualizzazione, ovvero oggetti destinati a gestire le gerarchie di visualizzazione. Ogni "schermo" in un'applicazione iOS ha il proprio controller di visualizzazione e questi controller vanno e vengono quando l'utente naviga attraverso l'app.

Il modello, d'altra parte, è un oggetto o un grafico di oggetti che rappresentano i dati su cui opera l'applicazione, e non cambia solo perché l'utente si muove nell'app.

Se utilizzerai un controller di visualizzazione come delegato del tuo modello, ti consigliamo di utilizzare un controller di visualizzazione la cui durata è simile a quella del modello. In un'app basata sulla navigazione, solitamente si intende il controller della vista radice, che è spesso l'oggetto che ha creato il modello in primo luogo. (Un altro candidato è il delegato dell'app, che è un altro oggetto longevo che a volte crea il modello.)

Non c'è motivo per cui un controller di visualizzazione non possa essere il delegato di una o più viste e anche del modello. Basta fare attenzione a considerare il problema della durata sopra descritto. Inoltre, considera se il tuo modello ha davvero bisogno di un delegato e se la delega è il modo giusto per trasmettere tutti i messaggi che il modello potrebbe aver bisogno di inviare. Altre opzioni includono KVO e notifiche.

    
risposta data 15.10.2012 - 06:50
fonte

Leggi altre domande sui tag