0

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

所以对于每个控制器,我都有一个 ViewModel。并且Controller绑定到他的ViewModel。

UIButton 绑定将如下所示:

@implementation HomeController

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

一切正常,但是当我想将参数传递给 ViewModel 时,我不确定这样做的正确方法是什么......

假设我有一个股票的 UICollectionView,每次点击特定股票,我都想导航到该股票资料页面。该逻辑应该在 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]];
}

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

谢谢 。

4

1 回答 1

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];

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

于 2014-09-14T14:08:44.497 回答