将RACCommand与MVVM模式一起使用,将参数发送到ViewModel

时间:2014-09-11 19:01:32

标签: objective-c mvvm reactive-cocoa raccommand

我在我的应用程序中使用ReactiveCocoa框架来获取使用MVVM设计模式的功能。

因此,对于每个Controller,我都有一个ViewModel。并将Controller绑定到他的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]];
}

我确定这不是最佳做法!所以我问,什么是??

谢谢。

1 个答案:

答案 0 :(得分: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]; 的实例而不是集合创建了单独的视图模型。因此,当您选择股票时,它可能看起来更像这样:

{{1}}

这显然省略了一些细节。例如,我的导航器将视图模型类映射到控制器类。按下视图模型时,它会创建相应的控制器,并将视图模型绑定到它。