您的位置:首页 > Web前端 > React

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
更优雅的实现了这个过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: