我应该重新绑定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。

有没有更好的方法?这不是“被动”吗?任何反馈将非常感激。

可以大幅度移动从静态的movieModelRACObserve宏观的动态部分简化这种情况下:

RAC(self.titleLabel, text) = RACObserve(self, movieModel.title); 

然后,你就会更新时,双方模型实例进行了交换,当一个模型实例本身改变。

如果您的视图模型包含信号本身,你可以这样做以下:

RAC(self.ratingLabel, text) = [[RACObserve(self, movieModel) map:^(id viewModel) { 
    return viewModel.currAverageRating; 
}] switchToLatest]; 
+0

谢谢,我有一种感觉,我失去了很基本的东西。 – akiraspeirs 2015-02-07 10:57:59

+0

如果我不使用RACObserve,是否有办法做到这一点?对于第二个例子,我会得到平均评分,你会做什么? – akiraspeirs 2015-02-07 11:19:57

+0

@AkiraSpeirs我已经更新了我的答案以涵盖此案例。 – Leo 2015-02-07 11:34:06