Ultimamente sto leggendo su ReactiveCocoa v3 e sto facendo fatica con l'impostazione di elementi di base. Ho già letto il changelog, i test, le poche domande su SO e gli articoli di Colin Eberhardt sull'argomento. Tuttavia, mi mancano ancora esempi di associazioni di base.Come creare binding di base in ReactiveCocoa 3 e 4
Diciamo che ho un'app che presenta il menu del giorno. L'app utilizza RAC3 e il pattern MVVM.
Model (Menu)
Il modello ha un metodo semplice per il recupero odierno menu. Per ora, questo non fa alcuna richiesta di rete, fondamentalmente crea solo un oggetto modello. La proprietà mainCourse
è una String
.
class func fetchTodaysMenu() -> SignalProducer<Menu, NoError> {
return SignalProducer {
sink, dispoable in
let newMenu = Menu()
newMenu.mainCourse = "Some meat"
sendNext(sink, newMenu)
sendCompleted(sink)
}
}
ViewModel (MenuViewModel)
Il modello vista espone diversi String
variabili per lasciare che il controller della vista mostrano il menu. Aggiungiamo solo una proprietà per mostrare il corso principale.
var mainCourse = MutableProperty("")
E aggiungiamo un binding per questo alloggio:
self.mainCourse <~ Menu.fetchTodaysMenu()
|> map { menu in
return menu.mainCourse!
}
ViewController (MenuViewController)
Ultimo ma non meno importante, voglio presentare questo corso principale di una vista. Aggiungerò un UILabel
per questo.
var headline = UILabel()
E infine voglio impostare la proprietà text
di quel UILabel osservando mio punto di vista del modello. Qualcosa di simile :
self.headline.text <~ viewModel.headline.producer
che purtroppo non funziona.
Domande
- Il metodo restituisce un
fetchTodaysMenu()
SignalProducer<Menu, NoError>
, ma cosa succede se voglio questo metodo per restituire unSignalProducer<Menu, NSError>
invece? Ciò renderebbe impossibile il binding nel modello di visualizzazione, in quanto il metodo ora potrebbe restituire un errore. Come gestisco questo? - Come già detto, l'attuale associazione nel mio controller di visualizzazione non funziona. Ho giocato con la creazione di uno
MutableProperty
che rappresenta la proprietàtext
delloUILabel
, ma non ho mai capito bene. Penso anche che sia goffo o verbale dover creare variabili extra per ogni proprietà che voglio legare. Questo non era necessario in RAC2. Ho anche cercato intenzionalmente di evitare l'uso diDynamicProperty
, ma forse non dovrei? Fondamentalmente voglio solo trovare il modo giusto di fareRAC(self.headline, text) = RACObserve(self.viewModel, mainCourse);
.
Qualsiasi altro feedback/guida su come eseguire questa configurazione di base è molto apprezzato.
Potresti essere interessato a leggere questo articolo: http://nomothetis.svbtle.com/an-introduction-to-reactivecocoa – mustafa
In effetti lo sono. Grazie @mustafa! –