IOS-响应式编程

关宏毅
2023-12-01

理论

函数式编程

1.如果想再去调用别的方法,那么就需要返回一个对象;

2.如果想用()去执行,那么需要返回一个block;

3.如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。

4.高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我们把他叫做高阶函数。在oc中,blocks是被广泛使用的参数传递,它实际上是匿名函数。

  1. 一个命令调用后的输出当作另一个命令输入,多个命令之间可以串起来操作

响应式编程(Functional Reactive Programming:FRP)

1.响应式编程是一种和事件流有关的编程模式,关注导致状态值改变的行为事件,一系列事件组成了事件流。

2.一系列事件是导致属性值发生变化的原因。FRP非常类似于设计模式里的观察者模式。

3.FRP与普通的函数式编程相似,但是每个函数可以接收一个输入值的流,如果其中,一个新的输入值到达的话,这个函数将根据最新的输入值重新计算,并且产生一个新的输出。这是一种”数据流”编程模式。

为什么我们要用它

1) 开发过程中,状态以及状态之间依赖过多,RAC更加有效率地处理事件流,而无需显式去管理状态。在OO或者过程式编程中,状态变化是最难跟踪,最头痛的事。这个也是最重要的一点。

2) 减少变量的使用,由于它跟踪状态和值的变化,因此不需要再申明变量不断地观察状态和更新值。

3) 提供统一的消息传递机制,将oc中的通知,action,KVO以及其它所有UIControl事件的变化都进行监控,当变化发生时,就会传递事件和值。

4) 当值随着事件变换时,可以使用map,filter,reduce等函数便利地对值进行变换操作。

UIButton

@weakify(self);
self.button.rac_command = [[RACCommand alloc]initWithSignalBlock:^RACSignal*(id input)]{
@strongify(self);
return [RACSignal empty];
}];

UIAlertView

 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];
 类似资料: