私は最近 ReactiveCocoa v3 を読んでいて、基本的なものを設定するだけで苦労しています。私はすでに変更ログ、テスト、いくつかの SO の質問、およびこの件に関する Colin Eberhardt の記事を読みました。ただし、基本的なバインディングの例はまだありません。
その日のメニューを表示するアプリがあるとします。アプリは RAC3 と MVVM パターンを使用しています。
モデル(メニュー)
このモデルには、今日のメニューを取得するための簡単なメソッドが 1 つあります。今のところ、これはネットワーク リクエストを行わず、基本的にはモデル オブジェクトを作成するだけです。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)
}
}
ビューモデル (MenuViewModel)
ビュー モデルはString
、ビュー コントローラーにメニューを表示させるためのさまざまな変数を公開します。メインコースを表示するためのプロパティを 1 つだけ追加しましょう。
var mainCourse = MutableProperty("")
そして、このプロパティのバインディングを追加します:
self.mainCourse <~ Menu.fetchTodaysMenu()
|> map { menu in
return menu.mainCourse!
}
ViewController (MenuViewController)
最後になりましたが、このメイン コースをビューで紹介したいと思います。これに a を追加しますUILabel
。
var headline = UILabel()
text
最後に、ビュー モデルを観察して、その UILabelのプロパティを設定したいと思います。次のようなもの:
self.headline.text <~ viewModel.headline.producer
残念ながらこれは機能しません。
質問
- このメソッド
fetchTodaysMenu()
は を返しますが、代わりにSignalProducer<Menu, NoError>
このメソッドが を返すようにしたい場合はどうすればよいでしょうか?SignalProducer<Menu, NSError>
これにより、メソッドがエラーを返す可能性があるため、ビュー モデルでのバインディングが失敗します。どうすればこれを処理できますか? - 前述のように、ビュー コントローラーの現在のバインディングが機能しません。のプロパティ
MutableProperty
を表すを作成して遊んでいますが、うまくいきませんでした。また、バインドしたいプロパティごとに追加の変数を作成しなければならないのは、ぎこちなく、冗長に感じると思います。これは RAC2 では必要ありませんでした。私も意図的に の使用を避けようとしましたが、そうすべきではないでしょうか? 私は基本的に、正しいやり方を見つけたいだけです。text
UILabel
DynamicProperty
RAC(self.headline, text) = RACObserve(self.viewModel, mainCourse);
この基本的なセットアップを行う方法に関するその他のフィードバック/ガイダンスは大歓迎です。