iOS 中 MVVM 搭配 RAC 数据经过操作更新后如何通知 TableView 刷新?

一个 TableView,上面 10条数据,我想删除某一行,然后刷新这一行,在 MVVM 下我有几个问题想请教下大家:

1.刷新列表这个动作,是不是该在控制器里做?
2.更新数据,就是上面删除点击的那一行数据,相关逻辑是不是该在 ViewModel 里面做?
3.TableView 的数据源是不是一般定义在 ViewModel 里面?

如果 1 2 3 都是的话,我在 ViewModel 里面处理完删除数据的逻辑,更新好数据源后,怎么通知控制器刷新 TableView 呢?

我尝试着监听 ViewModel 的数据源,在数据源被修改后,控制器可以收到 block 回调,可以简单的调用 reloadData 刷新全部列表,有没有其它办法可以直接触发控制器里某个回调直接刷新,而不是控制数据源来触发回调刷新

- (void)viewDidLoad {
    [super viewDidLoad];
    
    @weakify(self);
    
    //按钮 enabled 属性绑定
    RAC(self.btnDismiss,enabled) = self.viewModel.validDismissSignal;
    
    [[[RACObserve(self.viewModel, authorizations) distinctUntilChanged] skip:1] subscribeNext:^(NSArray <RRAuthorization *> *authorizations) {
        @strongify(self);
        [self.tvAuthorization reloadData];
        NSLog(@"监听到了数据源有改变 %@",authorizations);
        
    }];
    
    [self.tvAuthorization registerNib:[UINib nibWithNibName:RRAuthorizationCellIdentifier bundle:nil] forCellReuseIdentifier:RRAuthorizationCellIdentifier];
    
}

希望对 MVVM RAC 比较了解的朋友能够指教下....

阅读 3.8k
1 个回答

我们来数数把“数据变化”映射成“刷新列表”的几种办法:KVO、通知、代理、block、直接调用,是不是没有你喜欢的。。。2333333

你完全可以不 kvo,而是尝试着 block 回调,当你在 VC 里删除一行数据,调用 [self.vm deleteAtIndex:2],vm 内部处理完数据之后再 completeLoadDataBlock 回调给 VC

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进