2015-02-07 1 views
3

Я начал настраивать свои модели просмотра, чтобы они автоматически отвязали/привязали себя к любой модели, которую они представляют.Следует ли мне переустановить модели в 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; 

view model отменит старый MovieModel и привяжет себя к newModel.

Есть ли лучший способ? Разве это не «реактивно»? Любая обратная связь будет действительно оценена.

ответ

4

Вы можете значительно упростить этот случай, перемещая movieModel от статического к динамической части RACObserve макроса:

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

Тогда ваш взгляд будет обновляться и при замене экземпляров модели и когда модель сам экземпляр изменяется.

Если модель представления содержит сигналы себя, вы можете сделать что-то вроде следующего:

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

Спасибо, у меня было чувство, что я что-то на самом деле основной недостающий. – akiraspeirs

+0

Есть ли способ сделать это, если я не использую RACObserve? Что бы вы сделали для второго примера, когда я получаю средний рейтинг? – akiraspeirs

+0

@AkiraSpeirs Я обновил свой ответ, чтобы рассмотреть этот случай. – Leo

Смежные вопросы