我应该重新绑定ReactiveCocoa MVVM中的模型吗?
问题描述:
我已经开始设置我的视图模型,以便它们自动将它们解绑/绑定到它们代表的任何模型。我应该重新绑定ReactiveCocoa MVVM中的模型吗?
我对ReactiveCocoa比较陌生,想知道我在做什么是坏的/好的做法,或者如果有更好的方法去做。
举例来说,如果我有一个代表电影模型视图模型,我将其设置是这样的:
-(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。
有没有更好的方法?这不是“被动”吗?任何反馈将非常感激。
答
可以大幅度移动从静态的movieModel
到RACObserve
宏观的动态部分简化这种情况下:
RAC(self.titleLabel, text) = RACObserve(self, movieModel.title);
然后,你就会更新时,双方模型实例进行了交换,当一个模型实例本身改变。
如果您的视图模型包含信号本身,你可以这样做以下:
RAC(self.ratingLabel, text) = [[RACObserve(self, movieModel) map:^(id viewModel) {
return viewModel.currAverageRating;
}] switchToLatest];
谢谢,我有一种感觉,我失去了很基本的东西。 – akiraspeirs 2015-02-07 10:57:59
如果我不使用RACObserve,是否有办法做到这一点?对于第二个例子,我会得到平均评分,你会做什么? – akiraspeirs 2015-02-07 11:19:57
@AkiraSpeirs我已经更新了我的答案以涵盖此案例。 – Leo 2015-02-07 11:34:06