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];