MVVM With ReactiveCocoa
2017-05-13 10:37
465 查看
Functor Applica
4000
tive Monad
Functor
、Applicative
和
Monad
是什么:
一个 Functor就是一种实现了
Functor typeclass的数据类型。
一个
Applicative就是一种实现了
Applicative typeclass的数据类型。
一个
Monad就是一种实现了
Monad typeclass的数据类型。
typeclass
typeclass就类似于
Java中的接口,或者
Objective-C中的协议。在
typeclass中定义了一些函数,实现一个
typeclass就是要实现这些函数,而所有实现了这个
typeclass的数据类型都会拥有这些共同的行为。
Functor
、Applicative
和
Monad
三者之间的联系:
Applicative是增强型的
Functor,一种数据类型要成为
Applicative的前提条件是它必须是
Functor;
Monad是增强型的
Applicative,一种数据类型要成为
Monad的前提条件是它必须是
Applicative。
Functor
、 Applicative
和
Monad
三者之间的区别:
Functor:使用
fmap应用一个函数到一个上下文中的值;
Applicative:使用
<*>应用一个上下文中的函数到一个上下文中的值;
Monad:使用
>>=应用一个接收一个普通值但是返回一个在上下文中的值的函数到一个上下文中的值。
MVC
MVC是
iOS开发中使用最普遍的架构模式,同时也是苹果官方推荐的架构模式。
MVC代表的是
Model–View–Controller,它们之间的关系如下:
是的,
MVC看上去棒极了,
Model代表数据,
View代表
UI,而
Controller则负责协调它们两者之间的关系。然而,尽管从技术上看
View和
Controller是相互独立的,但事实上它们几乎总是结对出现,一个
View只能与一个
Controller进行匹配,反之亦然。既然如此,那我们为何不将它们看作一个整体呢:
因此,
M-VC可能是对
iOS中的
MVC模式更为准确的解读。在一个典型的
MVC应用中,
Controller由于承载了过多的逻辑,往往会变得臃肿不堪,所以
MVC也经常被人调侃成
Massive View Controller :
iOS architecture, where MVC stands for Massive View Controller.
MVVM
因此,一种可以很好地解决Massive View Controller问题的办法就是将
Controller中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是
ViewModel。其实,我们只要在上图中的
M-VC之间放入
VM,就可以得到
MVVM模式的结构图:
从上图中,我们可以非常清楚地看到
MVVM中四个组件之间的关系。
注:除了
View、
ViewModel和
Model之外,
MVVM中还有一个非常重要的隐含组件
Binder:
View:由
MVC中的
View和
Controller组成,负责
UI的展示,绑定
ViewModel中的属性,触发
ViewModel中的命令;
ViewModel:从
MVC的
Controller中抽取出来的展示逻辑,负责从
Model中获取
View所需的数据,转换成
View可以展示的数据,并暴露公开的属性和命令供
View进行绑定;
Model:与
MVC中的
Model一致,包括数据模型、访问数据库的操作和网络请求等;
Binder:在
MVVM中,声明式的数据和命令绑定是一个隐含的约定,它可以让开发者非常方便地实现
View和
ViewModel的同步,避免编写大量繁杂的样板化代码。在微软的
MVVM实现中,使用的是一种被称为
XAML 的标记语言。
响应式
函数式
高阶函数:高阶函数是入参是函数或者返回值是函数的函数不变量
迭代
数据绑定
在MVVM的架构中,最为关键的一环莫过于
ViewModel层与
View层的绑定了,我们的主角
FRP恰好可以解决绑定问题,同时还能处理跨层错误处理的问题。
// 单向绑定 RAC(self.someLabel, text) = RACObserve(self.viewModel, someProperty); RAC(self.scrollView, hidden) = self.viewModel.someSignal; RAC(self.confirmButton, frame) = [self.viewModel.someChannel map:^id(NSString *str) { CGRect rect = CGRectMake(0, 0, 0, str.length * 3); return [NSValue valueWithCGRect:rect]; }]; // 双向绑定 RACChannelTo(self.someLabel, text) = RACChannelTo(self.viewModel, someProperty); [self.textField.rac_newTextChannel subscribe:self.viewModel.someChannel]; [self.viewModel.someChannel subscribe:self.textField.rac_newTextChannel]; RACChannelTo(self, reviewID) = self.viewModel.someChannel; // 命令绑定 self.confirmButton.rac_command = self.viewModel.someCommand; RAC(self.textField, hidden) = self.viewModel.someCommand.executing; [self.viewModel.someCommand.errors subscribeNext:^(NSError *error) { // 错误处理在这里 }]; |
子 ViewModel
ViewModel不必在屏幕上显示所有东西。你可用子
Viewmodel来代表屏幕上更小,更潜在被封装的部分。如果一个视图上的一小块儿(比如表格的 Cell)在 App 中可以被重用以及表现多个数据-模型对象,子
ViewModel会格外有利。
ReactiveViewModel
ReactiveViewModel is a combination code/documentation project for building Cocoa applications using Model-View-ViewModel and ReactiveCocoa.https://github.com/ReactiveCocoa/ReactiveViewModel
注意事项
ViewModel中的代码是与
View无关的。
ViewModel中使用
readonly控制访问权限。
ViewController总的责任是处理
ViewModel中的变化。
并非使用
MVVM模式就必须的使用
ReactiveCocoa,可以使用
KVO,
Block,
Delegate,
Notification等手段,而
ReactiveCocoa更优雅的实现了这个过程。
相关文章推荐
- MVVM With ReactiveCocoa让移动开发更简单
- MVVM With ReactiveCocoa让移动开发更简单
- MVVM With ReactiveCocoa
- MVVM With ReactiveCocoa
- MVVM Tutorial with ReactiveCocoa: Part 1/2
- MVVM Tutorial with ReactiveCocoa
- MVVM With ReactiveCocoa
- 【译】MVVM Tutorial with ReactiveCocoa: Part 1/2
- MVVM设计模式教程 - tutorial with ReactiveCocoa
- MVVM With ReactiveCocoa
- MVVM 模式优化MVC模式之With ReactiveCocoa
- Functional Reactive Programming on iOS with ReactiveCocoa
- 干货集中营-ReactiveCocoa+RXSwift+MVVM
- ld: framework not found ReactiveCocoa clang: error: linker command failed with exit code 1
- 干货集中营-ReactiveCocoa+RXSwift+MVVM
- Wrapping AFNetworking With ReactiveCocoa
- ReactiveCocoa & MVVM 学习总结二
- Getting Started with ReactiveCocoa
- ReactiveCocoa + MVVM
- ReactiveCocoa & MVVM