Я читал в ReactiveCocoa v3 в последнее время, и я изо всех сил пытаюсь создать базовые вещи. Я уже прочитал журнал изменений, тесты, несколько вопросов SO и статьи Колина Эберхардта по этому вопросу. Тем не менее, я все еще не вижу примеров базовых привязок.Как сделать базовые привязки в ReactiveCocoa 3 и 4
Предположим, у меня есть приложение, в котором представлено меню дня. Приложение использует RAC3 и шаблон MVVM.
Модель (Меню)
Модель имеет один простой метод для извлечения меню сегодняшних. На данный момент это не делает каких-либо сетевых запросов, это в основном просто создает объект модели. Недвижимость mainCourse
- 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)
Модель вид раскрывает различные переменные для String
позволяя контроллер представления показать меню. Давайте просто добавим одно свойство для показа основного курса.
var mainCourse = MutableProperty("")
И мы добавим привязки для этого свойства:
self.mainCourse <~ Menu.fetchTodaysMenu()
|> map { menu in
return menu.mainCourse!
}
ViewController (MenuViewController)
И последнее, но не в последнюю очередь, я хочу представить это основное блюдо в представлении. Я добавлю для этого UILabel
.
var headline = UILabel()
И, наконец, я хочу, чтобы установить text
свойство этого UILabel путем наблюдения с моей точки зрения модели. Что-то как:
self.headline.text <~ viewModel.headline.producer
Который, к сожалению, не работает.
Вопросы
- Метод
fetchTodaysMenu()
возвращаетSignalProducer<Menu, NoError>
, но что, если я хочу, чтобы этот метод возвращаетSignalProducer<Menu, NSError>
вместо? Это сделало бы мою привязку в моей модели представления неудачной, поскольку метод теперь может вернуть ошибку. Как я могу справиться с этим? - Как уже упоминалось, текущая привязка в моем контроллере просмотра не работает. Я играл с созданием
MutableProperty
, который представляет собой свойствоUILabel
, но я так и не понял. Я также считаю, что неудобно или многословно создавать дополнительные переменные для каждого свойства, которое я хочу связать. Это не было необходимо в RAC2. Я намеренно также пытался избежать использованияDynamicProperty
, но, может быть, я не должен? Я просто хочу найти правильный способ сделатьRAC(self.headline, text) = RACObserve(self.viewModel, mainCourse);
.
Любые другие отзывы/рекомендации о том, как сделать эту базовую установку, высоко оценены.
Возможно, вам будет интересно прочитать эту статью: http://nomothetis.svbtle.com/an-introduction-to-reactivecocoa – mustafa
Действительно я. Спасибо @mustafa! –