函数式编程
1.如果想再去调用别的方法,那么就需要返回一个对象;
2.如果想用()去执行,那么需要返回一个block;
3.如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
4.高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我们把他叫做高阶函数。在oc中,blocks是被广泛使用的参数传递,它实际上是匿名函数。
- 一个命令调用后的输出当作另一个命令输入,多个命令之间可以串起来操作
响应式编程(Functional Reactive Programming:FRP)
1.响应式编程是一种和事件流有关的编程模式,关注导致状态值改变的行为事件,一系列事件组成了事件流。
2.一系列事件是导致属性值发生变化的原因。FRP非常类似于设计模式里的观察者模式。
3.FRP与普通的函数式编程相似,但是每个函数可以接收一个输入值的流,如果其中,一个新的输入值到达的话,这个函数将根据最新的输入值重新计算,并且产生一个新的输出。这是一种”数据流”编程模式。
为什么我们要用它
1) 开发过程中,状态以及状态之间依赖过多,RAC更加有效率地处理事件流,而无需显式去管理状态。在OO或者过程式编程中,状态变化是最难跟踪,最头痛的事。这个也是最重要的一点。
2) 减少变量的使用,由于它跟踪状态和值的变化,因此不需要再申明变量不断地观察状态和更新值。
3) 提供统一的消息传递机制,将oc中的通知,action,KVO以及其它所有UIControl事件的变化都进行监控,当变化发生时,就会传递事件和值。
4) 当值随着事件变换时,可以使用map,filter,reduce等函数便利地对值进行变换操作。
@weakify(self);
self.button.rac_command = [[RACCommand alloc]initWithSignalBlock:^RACSignal*(id input)]{
@strongify(self);
return [RACSignal empty];
}];
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"您正在使用4G/3G/2G网络,继续观看可能产生超额流量费" delegate:nil cancelButtonTitle:@"返回" otherButtonTitles:@"继续观看", nil];
[alertView show];
@weakify(self);
[alertView.rac_buttonClickedSignal subscribeNext:^(NSNumber * x) {
@strongify(self);
if (x.intValue == 0) {
}else {
}
}];
//冷信号
_liveRoomCommand = [[RACCommand alloc]
initWithSignalBlock:^RACSignal *(id input) {
@strongify(self);
//请求网络,赋值给liveModel
return [RACSignal empty];
}];
//接受model数据
//skip:.监听命令是否执行完毕,默认会来一次,可以直接跳过,skip表示跳过第一次信号。
//deliverOnMainThread:在主线程力主线程
[[[RACObserve(self.liveViewModel, liveModel) skip:1] deliverOnMainThread] subscribeNext:^(id x) {
@strongify(self);
//更新UI
}];
//激活信号
[self.liveViewModel.liveRoomCommand execute:nil];