Я недавно читал ReactiveCocoa v3, и я изо всех сил пытаюсь создать базовые вещи. Я уже прочитал журнал изменений, тесты, несколько вопросов SO и статьи Колина Эберхардта по этому вопросу. Тем не менее, я все еще не вижу примеров базовых привязок.
Скажем, у меня есть приложение, в котором представлено меню дня. Приложение использует 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
, который представляет свойствоtext
дляUILabel
, но я так и не понял. Я также считаю, что неудобно или многословно создавать дополнительные переменные для каждого свойства, которое я хочу связать. Это не было необходимо в RAC2. Я намеренно также пытался избежать использованияDynamicProperty
, но, может быть, я не должен? Я просто хочу найти правильный способ сделатьRAC(self.headline, text) = RACObserve(self.viewModel, mainCourse);
.
Любые другие отзывы/рекомендации о том, как сделать эту базовую установку, высоко оценены.