初学MVVM架构,跨两个视图控制器传递数据的方式是否正确
MVVM架构下跨视图控制器数据传递实现评估
问题场景
- 学习探索MVVM架构的过程中,遇到两个视图控制器间的数据传递卡点:ViewController1绑定的viewModel1维护了一个条目数组,需要将该数组传递给viewController2,当前实现可以跑通数据传递流程,但不确定是否符合MVVM的架构规范。
- 现有实现逻辑写在页面跳转的
prepare(for:sender:)回调中:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == Constants.kShowDetailSegue { let destinationViewController = segue.destination as! ListViewController destinationViewController.products = viewModel1.getFavouriteProducts() } }
备注:代码中的
getFavouriteProducts方法核心职责是从CoreData层读取用户收藏的条目数据。
现有实现的不符合规范问题
- 打破MVVM分层边界
- 视图层职责越界:来源VC直接调用viewModel1的CoreData读取方法、直接给目标VC的内部属性赋值,把VM层的数据获取逻辑、跨页数据传递逻辑全揉进了视图层,违背了“视图只负责渲染交互,不承载业务逻辑和数据组织”的设计原则。
- 目标VC职责混乱:目标VC直接对外暴露可被随意赋值的products数组属性,没有把数据承接的责任交给对应绑定的viewModel2,长期开发中会出现视图层直接持有业务数据、和VM层职责重叠的问题。
- 强耦合带来维护风险
当前实现中来源VC直接强转目标VC类型、硬编码目标VC的属性名,一旦目标页的类名调整、属性变更,会直接触发运行时崩溃,两个页面的跳转依赖没有做隔离。
规范改造方向
- 跨页跳转逻辑做隔离,不要在来源VC的prepare回调里直接接触目标VC的内部属性。
- 数据承接下沉到对应VM层:目标ListViewController需要绑定独立的ListViewModel,不要对外暴露可直接赋值的products数组,外部跳转时只需要传递业务参数(比如需要加载收藏列表的标识),由目标VM自己触发对应的数据读取逻辑。
- CoreData的读取逻辑统一收口到VM层,不要在VC的跳转回调里直接触发数据获取动作。
内容的提问来源于stack exchange,提问作者iOSDev
相关产品推荐
相关产品推荐

