2014-09-11 2 views
0

Я использую инфраструктуру ReactiveCocoa в своем приложении для использования с использованием шаблона проектирования MVVM.Использование RACCommand с шаблоном MVVM, отправка параметров в ViewModel

Итак, для каждого контроллера у меня есть ViewModel. и контроллер привязан к его ViewModel.

UIButton связывания будет выглядеть так:

@implementation HomeController 

-(void) bindViewModel { 
self.viewHeader.buttonSide.rac_command = self.viewModel.execiteFullPortfolio; 
} 

Это все работает хорошо, но когда я хотел бы передать параметры ViewModel, я не уверен, что это правильный способ сделать это .. .

Скажем, у меня есть UICollectionView of Stocks, и каждый щелчок на конкретном складе, я бы хотел перейти к странице профиля запасов. Эта логика должна быть сделана на ViewModel, но как мне получить запас, полученный с помощью RACCommand?

То, что я сейчас делаю это:

@implementation HomeController 
-(void) bindViewModel { 
__unsafe_unretained HomeController *weakSelf = self; 
self.viewPortfolioPusherView.scrollGainView.blockSelect =^(STStock *stock){ 
     weakSelf.viewModel.selectedStock = stock; 
     [weakSelf.viewModel.executeGoToStock execute:[RACSignal empty]]; 
    }; 

} 


@implementation HomeViewModel 
-(void) initialization { 
    self.executeGoToStock = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [weakSelf moveToSelectedStock]; 
     }); 
     return [RACSignal empty]; 
    }]; 
} 
-(void) moveToSelectedStock { 
    [self stockProfileControllerLazy]; 
    self.stockProfileController.stock = self.selectedStock; 
    [Navigator pushController:self.stockProfileController fromController:[self.delegate controller]]; 
} 

Я уверен, что это не лучшая практика! Поэтому я спрашиваю, что такое ???

Спасибо.

ответ

3

Почему бы просто не передать экземпляр STStock в вызов execute по команде, а не пустой сигнал?

[weakSelf.viewModel.executeGoToStock execute:stock]; 

Тогда:

self.executeGoToStock = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(STStock *stock) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [weakSelf moveToSelectedStock:stock]; 
     }); 
     return [RACSignal empty]; 
}]; 

Вы, очевидно, нужно изменить moveToSelectedStock принять параметр а. Тем не менее, я бы пошел немного дальше на реализацию RACCommand на ваш Navigator, который делает это. Кроме того, я бы сделал отдельную модель представления для экземпляра STStock, а не коллекции. Таким образом, при выборе акций, это может выглядеть немного больше, как это:

StockViewModel *viewModel = [[StockViewModel alloc] initWithStock:stock]; 
[[Navigator pushViewModel] execute:viewModel]; 

Это, очевидно, опускает несколько деталей. Например, мой навигатор сопоставляет классы моделей с классами контроллера. Когда модель представления нажата, она создает соответствующий контроллер и привязывает к ней модель представления.