我应该在 ReactiveCocoa MVVM 中重新绑定模型吗?
Should I rebind models in ReactiveCocoa MVVM?
我已经开始设置我的视图模型,因此它们会自动 unbind/bind 自己到它们所代表的任何模型。
我对 ReactiveCocoa 比较陌生,想知道我正在做的是 bad/good 练习还是有更好的方法。
例如,如果我有一个表示电影模型的视图模型,我会这样设置它:
-(void)bind{
[RACObserve(self, movieModel) subscribeNext:^(id x) {
[self unbindMovieModel];
[self bindMovieModel];
}];
}
-(void)unbindMovieModel{}
-(void)bindMovieModel{
self.titleSignal = [RACObserve(self.movieModel, title)
takeUntil:[self rac_signalForSelector:@selector(unbindMovieModel)];
self.averageRatingSignal = [[self.movieModel currAverageRating]
takeUntil:[self rac_signalForSelector:@selector(unbindMovieModel)];
//Setup some more complex signals, etc...
}
现在,如果我在任何时候这样做:
self.movieModel = newModel;
视图模型将与旧的 movieModel 解除绑定并将其自身绑定到 newModel。
有没有更好的方法?这不是"reactive"吗?任何反馈将不胜感激。
您可以通过将 movieModel
从 RACObserve
宏的静态部分移动到动态部分来大大简化这种情况:
RAC(self.titleLabel, text) = RACObserve(self, movieModel.title);
然后,当模型实例被交换时以及模型实例本身发生变化时,您的视图都会更新。
如果您的视图模型本身包含信号,您可以执行以下操作:
RAC(self.ratingLabel, text) = [[RACObserve(self, movieModel) map:^(id viewModel) {
return viewModel.currAverageRating;
}] switchToLatest];
我已经开始设置我的视图模型,因此它们会自动 unbind/bind 自己到它们所代表的任何模型。
我对 ReactiveCocoa 比较陌生,想知道我正在做的是 bad/good 练习还是有更好的方法。
例如,如果我有一个表示电影模型的视图模型,我会这样设置它:
-(void)bind{
[RACObserve(self, movieModel) subscribeNext:^(id x) {
[self unbindMovieModel];
[self bindMovieModel];
}];
}
-(void)unbindMovieModel{}
-(void)bindMovieModel{
self.titleSignal = [RACObserve(self.movieModel, title)
takeUntil:[self rac_signalForSelector:@selector(unbindMovieModel)];
self.averageRatingSignal = [[self.movieModel currAverageRating]
takeUntil:[self rac_signalForSelector:@selector(unbindMovieModel)];
//Setup some more complex signals, etc...
}
现在,如果我在任何时候这样做:
self.movieModel = newModel;
视图模型将与旧的 movieModel 解除绑定并将其自身绑定到 newModel。
有没有更好的方法?这不是"reactive"吗?任何反馈将不胜感激。
您可以通过将 movieModel
从 RACObserve
宏的静态部分移动到动态部分来大大简化这种情况:
RAC(self.titleLabel, text) = RACObserve(self, movieModel.title);
然后,当模型实例被交换时以及模型实例本身发生变化时,您的视图都会更新。
如果您的视图模型本身包含信号,您可以执行以下操作:
RAC(self.ratingLabel, text) = [[RACObserve(self, movieModel) map:^(id viewModel) {
return viewModel.currAverageRating;
}] switchToLatest];