2014-09-22 20 views
35

HA qualcuno ha implementato un pattern MVVM nell'app iOS senza utilizzare ReactiveCocoa?Esempio MVVM/Esempio di implementazione in iOS

Trovato un sacco di esempi qui, ma tutti usano Cacao reattivo. Volevo un semplice esempio di implementazione MVVM.

+2

La tua domanda è interessante ma troppo ampia. Cos'hai in mente? Altrimenti, dovresti dare un'occhiata a questi due post del blog: [Swift: Usare MVVM per lavorare con gli optionals] (http://natashatherobot.com/swift-mvvm-optionals/) e [Introduzione a MVVM] (http: // www.objc.io/issue-13/mvvm.html). Si può anche leggere questo thread: [Riscrivere il codice da Objective-C per conformarsi con gli strumenti di potere di Swift e lo stile conciso] (http://codereview.stackexchange.com/questions/62958/rewrite-code-from-objective-c-to -conform-con-swift-power-strumenti-e-conciso-styl). L'eccellente risposta fornita da Rob Mayoff utilizza l'installazione di MVVM. –

+2

Un altro esempio di Swift MVVM su GitHub [qui] (https://github.com/shilgapira/SwiftDemoMVVM). –

+0

Ottieni i vantaggi dell'adozione di MVVM solo se disponi di un sistema che ti aiuta con l'associazione dei dati.In iOS questo è quasi certamente un meccanismo KVO. Avrai bisogno di questo per evitare di scrivere il tuo codice di tracciamento delle modifiche per ogni proprietà. ReactiveCocoa è il progetto più maturo che unifica l'API KVO insieme a notifiche e flussi asincroni ed è incredibilmente potente una volta superata la curva di apprendimento. Consiglierei di non cercare di evitarlo, ma in realtà di abbracciarlo. – fatuhoku

risposta

40

Il cacao reattivo non è richiesto per MVVM. Ho costruito un framework MVVM di grande successo senza alcun legame. I binding non sono un requisito per MVVM.

In particolare, il collegamento tra il modello e la Vista Vista richiede la vista del modello per segnalare al Vista che deve aggiornare i dati. Questo può essere ottenuto usando Reactive Cocoa, KVO (mi piace molto il KVOController di Facebook), o anche usando un semplice pattern delegato.

Il modello di visualizzazione riconosce quando è necessario aggiornare la vista: i dati sono cambiati o si effettua una richiesta di dati asincrona tramite il modello e il modello è stato caricato nel modello di vista.

Quando si imposta la vista, si potrebbe associare ogni controllo al corrispondente valore del Model View. Ho scoperto che quando ho bisogno di sfornare schermi, questo può diventare molto noioso. Invece, preferirei avere un unico metodo che viene chiamato quando il View Model segnala che la vista dovrebbe aggiornarsi. All'interno di questo metodo, ho semplicemente intenzione di impostare tutte le mie proprietà di controllo.

Ora, è sufficiente preoccuparsi di come viene attivato quel metodo. Nel mio contesto personale, utilizzo KVO e i miei ViewController controllano una proprietà di timestamp sulla mia base di esempio ViewModel. Ogni volta che i miei modelli di vista aggiornano i loro dati sottostanti, il loro timestamp viene aggiornato che attiva l'aggiornamento. Il controller di visualizzazione può essere altrettanto facilmente registrato come delegato di aggiornamento di ViewModel e utilizzare un modello di delegato standard.

Ancora, non è MVVM sui requisiti di attuazione specifiche, e più di un concetto più alto livello di separazione dei problemi, la dipendenza disaccoppiamento, e incapsulamento.

+1

Questa è una buona lettura http://rasic.info/bindings-generics-swift-and-mvvm/ – DogCoffee

+0

Ho usato il pattern delegato in modo abbastanza efficace. – SilentNot

+0

L'OP richiesto per un semplice esempio. – nmdias

1

Ho creato un progetto semplice utilizzando MVVM: Model-View-ViewModel

Si prega di controllare sotto il collegamento Github:

https://github.com/harshal-wani/MVVM-BestPractice

+0

quando ti piace creare/allegare l'altra metà del tuo progetto? l'incursione dei dati sembra fatta a metà ... – holex