iOS开发模式MVVM 2分离业务逻辑
我想大多初始化定义的代码都能看懂,也没有叙述的必要,我主要把我觉得最主要的几个部分叙述一下。
代理 Protocol
为什么先说代理。这也是之前和慎哥也说过cell里面有点击事件怎么写。(不知道这么写对不对...后面看一部分源码之后会再聊这个话题,先留坑)代理可以干什么,跨Controller传值。跨Controller调方法。
我们之前写代理,都是在某个Controller里的.h文件最上面创建代理。但实际上,Xcode提供了专门的Protocol文件。之前没有搞明白也是因为我觉得代理必须要再某个文件里声明。
所以,当我们单独声明了一个Protocol文件的时候,就意味着,这个Protocol可以像一个类一样来声明变量了。
RACCommand
这个东西是做啥的。我只能说我解释不好,因为我没有完全理解这个东西。我只能把我理解的说出来。
我们的按钮都有一个点击事件。当点击的时候出发一个函数。
但是,当我们用了RACCommand的时候,我们的点击事件就可以这么写了。
self.pushBtn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {NSLog(@"test signal");return [RACSignal empty];
}];
和我之前写过的这种写法又不一样了。这种写法其实是对button addtarget那个方法的一个rac式的封装。
[[self.testBtn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {TestViewController *testVC = [[TestViewController alloc] init];[self.navigationController pushViewController:testVC animated:YES];
}];
用第一种方法的原因呢,我们可以把点击事件赋值成为一个RACCommand类型的属性。既然可以变成一个属性了,那么就可以重新定义并且赋值。
分离点击事件
我们新建一个FirstViewModel,在FirstViewModel.h中增加一个
@property (strong, nonatomic) RACCommand *excutePush;
然后我们让刚刚在FirstViewController里定义的那个pushBtn的rac_command,将它赋值为FirstViewModel里的excutePush
self.pushBtn.rac_command = self.viewModel.excutePush;
这么一赋值,就达成了一个目的。按钮的事件在viewModel中执行。
需要注意的是,RACCommand的block返回的时一个signal。所以,在viewModel中,我们要这么写
self.excutePush = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {NSLog(@"test signal");return [RACSignal empty];}];
这样,我们就实现了对点击事件的分离。
分离跳转
分离跳转,就要用到我开始说的代理了。
我们做一个MVVMdemoService的代理,我放在Protocol文件夹里了。这个代理就声明了一个方法
- (void)pushViewModel:(id)viewModel;
我们在NSLog(@"test signal");下面增加
[self.service pushViewModel:viewModel];
我们还要实现这个代理。
在ray中的教程和雷大神的MVVMReactiveCocoa都是新建了一个Impl文件,专门用来跳转,基本思路就是navigation本身就是一个堆栈,其实所有的vc都是在navigation其中的。我们只要控制这个这个最基本的navigation的跳转就可以了。
我们新建一个MVVMdemoImpl文件,里面有一个初始化的方法。
- (instancetype)initWithNavigationController:(UINavigationController *)navigationController
我们把根navigation传进去来进行逻辑跳转。
我们在初始化的时候加上这两句核心代码。
self.demoImpl = [[MVVMdemoImpl alloc] initWithNavigationController:self.naviVC];
self.firstViewModel = [[FirstViewModel alloc] initWithService:self.demoImpl];
第一句话是声明了一个demoImpl,将navigation穿进去。
第二句话是声明了一个firstViewModel,把第一个demoImpl传了进去。这个地方的疑问在于,我们声明的时候是
-(instancetype)initWithService:(id<MVVMdemoService>)service
参数是一个代理。我们传的时一个NSObject类型的值。而且在MVVMdemoImpl.m中,也没有对于代理的赋值为自己。
我是这么理解的,如果有不对,还请谅解。
当我们加入代理MVVMdemoService在MVVMdemoImpl的时候,因为MVVMdemoImpl是一个nsobject类型,而MVVMdemoService也是一个nsobject类型。所以,此时我们的MVVMdemoImpl具有MVVMdemoService的属性了,我们做的就是,让FirstViewModel里的service的代理即是MVVMdemoImpl。
简单的说。
就是MVVMdemoImpl == FirstViewModel.service
那么这样的话,我们的service就可以执行MVVMdemoImpl里的pushViewModel方法了。
小结
其实上面的最后AppDelegate的赋值代理这一块还不是很明白。有时间再说说吧。好久没写博客就想发一篇了。
以上完整代码在MVVMdemo
参考链接
1.leichunfeng/MVVMReactiveCocoa
2.ReactiveCocoa Essentials: Understanding and Using RACCommand
3.Why Does RACCommand's block return a signal?
4.MVVM Tutorial with ReactiveCocoa: Part 1/2
iOS开发模式MVVM 2分离业务逻辑相关推荐
- iOS开发:MVVM的使用分析
在iOS开发过程中,MVC的使用可谓是众所周知,作为iOS开发人员也都经常使用这个模式.在MVC下,所有的对象都被归类成一个Model.一个View.一个Controller.虽然现在MVC仍然是主流 ...
- iOS开发那些事--编写OCUnit测试方法-逻辑测试方法
应用测试和逻辑测试 添加OCUnit到工程时候,我们提到过,应用测试(Application Testing)和逻辑测试(Logic Testing)两个概念,它们并非是OCUnit中的概念,而是单元 ...
- 前端开发--播放页面评论区业务逻辑初步
1.这次主要涉及前后端的数据交互 jquery 教程: http://www.w3school.com.cn/jquery/index.asp 2.工程地址:https://github.com/di ...
- iOS开发之聊天模块--内容保存逻辑实现
需求详解: 在实际开发中,有可能是在后期优化的时候,会有这么需要优化的需求:聊天输入框保存之前输入的文本,提高用户的良好体验. 在聊天模块中,用户可能会在输入框输入若干字符,但是没有点击发送就点击退出 ...
- MVVM开发模式MVVM Light Toolkit中使用事件和参数传递
Light中定义了类GalaSoft.MvvmLight.Command.RelayCommand 这个类继承了ICommand方法,实现了其中的方法,Action就是一个方法参数 // 摘要: // ...
- 前后端分离业务逻辑常用封装函数(一)
1.数组去空: function clear_arr_trim(array) { for(var i = 0 ;i<array.length;i++){ if(array[i] == &qu ...
- 分层:数据访问层、业务逻辑层、视图层
分层:开发模式 数据访问层 业务逻辑层:调用数据访问层 视图层:调用业务逻辑层 数据库表 1.创建项目 2.创建包: com.zking.util com.zking. ...
- iOS开发笔记--基于面向协议MVP模式下的软件设计
传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面: 相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS ...
- 什么是MVC开发模式?
全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业 ...
- node.js服务端笔记文档学会写接口,学习分类:path、包、模块化、fs、express、中间件、jwt、开发模式、cors。
node.js 学习笔记 node.js服务端笔记文档学会写接口,path.包.模块化.fs.express.中间件.JWT.开发模式.cors. gitee:代码接口笔记 1什么是node.js n ...
最新文章
- ODS:输出多样化采样,有效增强白盒和黑盒攻击的性能 | NeurIPS 2020
- oracle会话超时,Oracle EBS控制会话时间及超时
- 蓝桥杯省内模拟赛解题过程
- Swift中的延迟加载(懒加载)
- Java service层获取HttpServletRequest工具类的方法
- 创意夜晚行驶迷路网站404页面源码
- 内存管理(C语言中malloc和free的用法)
- 珍惜吧,这届世界杯之后,怕是再也看不到他们了
- C++ 引用计数技术及智能指针的简单实现
- Java常用算法-二分查找算法(两种方法实现)
- 桌面好看的linux系统,可以当桌面的LINUX漂亮壁纸
- iOS Presenting view controllers on detached view controllers is discouraged
- Paddleocr部署进一步优化
- php 错误 异常,PHP错误异常处理
- android fragment 白屏,当应用Crash后fragment出现白屏
- 学python编程能做什么项目_十个Python练手的实战项目,学会这些Python就基本没问题了...
- addEventListener() 事件监听
- 蒙特卡洛模拟方法的matlab实现(2)
- Word中如何将英文翻译成中文?简单的方法介绍
- Swing版《房屋租赁合同》