@
LINAICAI C 并不和 VM 对应啊,其实更像是把业务逻辑部分从传统的 VM 中剥离出来,放入 DataManager ,而 VM 只对应 V ,有多少 V 就有多少 VM 。 DataManager 对应楼主的 Store ,但也确实多出来一堆 VM ,但这部分是可以复用的,个人认为值。不知道楼主的瘦 Model 中具体是怎样的,比如日期,如果存储的是 NSString 的话,那这个其实就是楼主的瘦 Model 了,只不过可能多了数据转换这一步。
举个栗子,一个 tableview 上每个 Cell 都显示着人名和生日,刚开始学 iOS 时是直接在 C 中获取,然后在 tableview 的代理方法处转换并绑定。但这转换和绑定部分是可以复用的。所以现在的做法是在 DataManager 中获取并,然后 VM 中自己转换, V 中进行绑定。比如 DM 中从 JSON 取来一系列{"name":"John", "birth":"1984-1-1"},接着转成一系列 entity :{NSString *name, NSDate *birth}。 VM 有自己的+viewModelWithEntity:,转换成一系列 VM :{NSString *name, NSString *birthString}。这一系列 VM 就存在 DM 中的 VMs 数组。 tableview 代理处只需[cell bindDataWithViewModel:viewmodel]即可(此时的 V 是一个 Cell )。这样 VM 和 V 拥有较高的复用性。甚至如果多处 tableview 都只是呈现列表, tableview 这一部分还可以进一步抽象封装成一个 baseTableViewController ,只留出 callback 。当然这是很传统的方法,只不过代码存放位置做了调整,应该不会像双向绑定那样有其他不确定性,比较好上手和过渡。
也试过用单例封装一些通用的数据请求逻辑和一些全局变量,可能和楼主的这个有些像。不过到了后边,密密麻麻一整片,看着也是累。估计拆分成 category 会明朗些。现在的做法是各个 DataManager 都继承于一个 BaseDataManager ,发现逻辑或数据其他 C 也用得上的就直接剪到基类去,应该比 category 好点。
这个没啥好办法啊, C 是最不能复用的那个了吧,所以其他能复用的一般都尽可能单独抽取出来了。能注意的是尽可能保持各处统一,比如楼主重复跳转到一个控制器这个,举个栗子,在多个地方点击头像跳转到用户详情页,额,不知道是不是这种跳转,假设是一回事儿,我的做法是下边这种,头像的 tappedBlock 类似这样:
```
UITabBarController *tabBarController = (UITabBarController)UIApplication.sharedApplication.delegate.window.rootViewController;
UINavigationController *nav = tabBarControler.selectedViewController;
XXUserViewController *userViewController = [XXUserViewController alloc] initWithUid:uid];
[nav pushViewControlleruserViewController:animated:YES];
```
这一段可以直接封装进头像控件。直接从切面取出 nav ,不用担心控件可能不是刚好处于 vc.view 需要顺着响应链去查找 nav 。当然这需要各个 Tab 都有个 RootNav 才能做到完全通用。跳转使用的是模态则直接让 tabBarController 来。
可能因为团队成员专写 iOS 的就我一只,老大负责疑难杂症和 review ,对具体代码过程没啥限制,项目也不大,所以想使用啥都可以试试。可以边写边改进哈哈。。