Objective c 使用带有MVVM模式的RAC命令,将参数发送到ViewModel

Objective c 使用带有MVVM模式的RAC命令,将参数发送到ViewModel,objective-c,mvvm,reactive-cocoa,raccommand,Objective C,Mvvm,Reactive Cocoa,Raccommand,我在我的应用程序中使用了ReactiveCocoa框架,用于使用MVVM设计模式的power 因此,对于每个控制器,我都有一个ViewModel。控制器绑定到他的ViewModel UIButton绑定看起来是这样的: @implementation HomeController -(void) bindViewModel { self.viewHeader.buttonSide.rac_command = self.viewModel.execiteFullPortfolio; } 这一

我在我的应用程序中使用了ReactiveCocoa框架,用于使用MVVM设计模式的power

因此,对于每个控制器,我都有一个ViewModel。控制器绑定到他的ViewModel

UIButton绑定看起来是这样的:

@implementation HomeController

-(void) bindViewModel {
 self.viewHeader.buttonSide.rac_command = self.viewModel.execiteFullPortfolio;
}
这一切都很好,但当我想将参数传递给ViewModel时,我不确定什么是正确的方法

假设我有一个股票的UICollectionView,每次点击一个特定的股票,我都想导航到股票简介页面。 这种逻辑应该在ViewModel中完成,但是如何使用rac命令传递股票呢

我目前正在做的是:

@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]];
}
我相信这不是最好的做法!所以我在问,什么是


谢谢。

为什么不将
STStock
实例传递到对命令的
execute
调用中,而不是传递一个空信号

[weakSelf.viewModel.executeGoToStock execute:stock];
然后:

显然,您需要修改
moveToSelectedStock
以获取参数。然而,我会更进一步,在您的
导航器上实现一个
RACCommand
,这样做。此外,我将为
STStock
的实例而不是集合创建一个单独的视图模型。因此,当你选择一只股票时,它可能看起来更像这样:

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

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

为什么不将
STStock
实例传递到命令上的
execute
调用中,而不是传递一个空信号

[weakSelf.viewModel.executeGoToStock execute:stock];
然后:

显然,您需要修改
moveToSelectedStock
以获取参数。然而,我会更进一步,在您的
导航器上实现一个
RACCommand
,这样做。此外,我将为
STStock
的实例而不是集合创建一个单独的视图模型。因此,当你选择一只股票时,它可能看起来更像这样:

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

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

为什么不将
STStock
实例传递到命令上的
execute
调用中,而不是传递一个空信号

[weakSelf.viewModel.executeGoToStock execute:stock];
然后:

显然,您需要修改
moveToSelectedStock
以获取参数。然而,我会更进一步,在您的
导航器上实现一个
RACCommand
,这样做。此外,我将为
STStock
的实例而不是集合创建一个单独的视图模型。因此,当你选择一只股票时,它可能看起来更像这样:

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

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

为什么不将
STStock
实例传递到命令上的
execute
调用中,而不是传递一个空信号

[weakSelf.viewModel.executeGoToStock execute:stock];
然后:

显然,您需要修改
moveToSelectedStock
以获取参数。然而,我会更进一步,在您的
导航器上实现一个
RACCommand
,这样做。此外,我将为
STStock
的实例而不是集合创建一个单独的视图模型。因此,当你选择一只股票时,它可能看起来更像这样:

StockViewModel *viewModel = [[StockViewModel alloc] initWithStock:stock];
[[Navigator pushViewModel] execute:viewModel];
这显然忽略了一些细节。例如,我的导航器将视图模型类映射到控制器类。推送视图模型时,它将创建相应的控制器,并将视图模型绑定到该控制器