软件层次
工具层
(utility,通用的工具,和具体的业务无关)
网络层
(负责和server进行交互)
软件层次
工具层
(utility,通用的工具,和具体的业务无关)
网络层
(负责和server进行交互)
数据持久层
(本地缓存、数据库)
model层
(原始数据的类载体,比如来自网络或数据库的时间戳,不进行处数据理)
逻辑层
(viewmodel层,软件业务功能逻辑相关,可以给每个界面增加个逻辑层,也可以给一个业务功能多个界面增加一个逻辑层)
UI层
(显示的view)
控制层
(controller是个大杂炖,上面那些层都在这个controller里面彼此交互)
软件框架
大多是MVC
模式
缺点:经常会导致C很臃肿,不易管理,所以出现了MVVM。
MVVM模式
MVVM
就是将业务逻辑从controller里面抽出来单独生成一个类,降低耦合
如果要想把业务逻辑从controller中抽取出来,以实现逻辑层(viewmodel)是逻辑的载体,那么逻辑层至少需要
1 | 1 实时的接受view里面各种数据源和事件源的变化(比如输入框、按钮等) |
要实现这两条,就需要响应式编程
的概念。
1 | 函数响应式编程(Functional Reactive Programing : FRP) : 面向数据流的变化传播(管道处理,比如过滤,类型映射,订阅,组合,属性绑定) |
比如 excel 3-8数码管 订阅(公众号、日报),详见wiki
数据流,逻辑流 这种概念思想很重要,和命令式编程大不一样
由此,Reactive Cocoa
应运而生。
Reactive Cocoa 可以承担以下任务
1 数据流统一封装分发
2 数据(双向)绑定
3 动作事件通知
代码实例
1 | // data binding |
关于使用RAC(…),有时会有这样的错误error : is already bound to key path "" on object rac
,原因是
1 | RAC(self.viewModel,smsCode) = _phoneTF.rac_textSignal; |
[RACSignal createSignal] 方式创建signal,只创建一次就OK
1 | -(RACSignal *)validatePhoneSignal |
[RACSubject subject] 创建的signal,每次都得创建
1 | -(RACSignal *)rechargeSignal |