我在我的应用程序中使用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]];
}
我确定这不是最佳做法!所以我问,什么是??
谢谢。
答案 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}}
这显然省略了一些细节。例如,我的导航器将视图模型类映射到控制器类。按下视图模型时,它会创建相应的控制器,并将视图模型绑定到它。