我应该在 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"吗?任何反馈将不胜感激。

您可以通过将 movieModelRACObserve 宏的静态部分移动到动态部分来大大简化这种情况:

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

然后,当模型实例被交换时以及模型实例本身发生变化时,您的视图都会更新。

如果您的视图模型本身包含信号,您可以执行以下操作:

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