RAC初识

RAC:

    ReactiveCocoa 主要是由以下四大核心组件:

    RACStream :信号源

    RACSubscriber:订阅者

    RACScheduler:调度器

    RACDisposable:清洁工

ReactiveCocoa使用信号来代表异步事件,提供了统一的方式来处理所有异步的行为,包括代理,block,target-action,通知,kvo等等;

代理

target-action

通知 

KVO

登录效果小测试

除了RAC团队定义好的信号量供我们使用,我们还可以自己创建一个signal来执行一些自己的操作

RACSignal类中有一个创建信号量的方法 createSignal然后在Block块中实现一些操作

:

RACSignal  * jsonSignal  =    [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {

        NSURLSessionConfiguration * c = [NSURLSessionConfiguration defaultSessionConfiguration];

        NSURLSession * session = [NSURLSession sessionWithConfiguration:c];

        NSURLSessionDataTask * data = [session dataTaskWithURL:[NSURL URLWithString:urlStr]completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            if (error) {

                [subscriber sendError:error];

            }else{

                NSError * e;

                NSDictionary *jsonDic= [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&e];

                if (e) {

                    [subscriber sendError:e];

                }

                else{

                    [subscriber sendNext:jsonDic];

                    [subscriber sendCompleted];

                }

            }

        }];

        [data resume];//执行这个task

        return [RACDisposable disposableWithBlock:^{

        }];

    }];

通过订阅 获得这个信号量中的数据

[ jsonSignal  subscribeNext:^(id  _Nullable x) {

        NSLog(@"%@",x);

    }error:^(NSError * _Nullable error) {

        NSLog(@"%@",error);

    }];

但是此时有个小问题需要注意一下[每订阅一次 或者在不同的地方订阅这个信号量 这个signal中的任务执行一次  所以多次订阅 多次执行  这种在有些时候不是我们想要的

假如:如果这个信号量中的任务是对一个局部变量__block  int  x = 0 ;  做 x+=5  ;

第一次订阅 a=5;

第二次订阅 a=10;

]

如果不想要自己创建的signal中的任务重复执行 那么可以使用 replayLast把这个signal变成记录型的signal

[[RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {

      }]  replayLast];

你可能感兴趣的:(RAC初识)