一.ReactiveCocoa(简称为RAC)是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾。
我也是才刚刚学习,将学到的东西记录下来:
- 1.RAC中RACSignal信号类是核心:
1.1创建一个信号:
创建信号:
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
发送信号
[subscriber sendNext:@"五哥最帅"];
取消信号,如果信号想被取消,就必须返回一个RACDisposable
信号什么时候被取消:
1.自动取消,当一个信号的订阅者被销毁的时候就会自动取消订阅
2.手动取消.
block什么时候调用:一旦这个信号被取消和订阅就会执行block内的代码
block作用:当信号被取消的时候用于清空一些资源
return [RACDisposable disposableWithBlock:^{
NSLog(@"取消订阅!!!");
}];
}];
订阅信号:subscribeNext
把nextBlock保存到订阅者里面
只要订阅信号就会返回一个取消订阅信号的类
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"----- %@", x);
}];
取消订阅
[disposable dispose];
RACSignal总结:
- 1.核心:
- 1.1核心:信号类
- 1.2信号类的作用:只要有数据改变就会把数据包装成信号传递出去.
- 1.3只要有数据改变就会信号发出.
- 1.4数据发出去,不是信号类发出去,信号类不能发送数据
二.使用方法:
- 2.1创建信号
- 2.2订阅信号
- 2.3取消订阅
三.实现思路:
- 3.1当一个信号被订阅,创建订阅者,并把nextBlock并存到订阅者里面.
- 3.2创建的时候会返回[RACDynamicSignal createSignal:didSubscribe];
- 3.3调用RACDynamicSignal的didSubscribe
- 3.4发送信号[subscriber sendNext:value];
- 3.5拿到订阅者的nextBlock调用
二:快速进行遍历字典或者是数组:RACTupleUnpack宏:专门用来解析元祖
NSDictionary *dict = @{@"key1":@"One",@"key2":@"two",@"key3":@"three",@"key4":@"four",@"key5":@"five",@"key6":@"six",@"key7":@"seven",@"key8":@"engit",@"key9":@"nine"}; [dict.rac_sequence.signal subscribeNext:^(id x) {
- RACTupleUnpack等号右边:需要解析元组宏的参数,左边:填解析什么的数据元组里面有几个值,宏的参数必须填几个
RACTupleUnpack(NSString *key, NSString *value) = x;
NSLog(@"key = %@, --- value = %@", key, value);
}
error:^(NSError *error) {
} completed:^{
}];
- 当有多个订阅者,但是我们只想发送一个信号怎么办?
RACMulticastConnection 我们用这个就可以实现了.
- 第一种写法(普通写法:这样的缺点是:每订阅一次信号就得重新创建并发送请求,这样很不友好)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"ws"];
NSLog(@"发送请求啦");
return [RACDisposable disposableWithBlock:^{
NSLog(@"qqqqqqqq");
}];
}];
订阅信号(我下面订阅的三次信号,通过打印可以知道,signal一共创建了三次).
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"ss = %@", x);
}];
//取消订阅
[disposable dispose];
}
- 使用这种方法来解决上面出现的问题
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
比较好的做法,使用RACMulticastConnection,无论多少个订阅者,无论订阅多少次,我只创建一个信号并只发送一次.
发送请求用一个信号内包装,不管有多少个订阅者,只想发送一次请求;
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"发送信号了!!!");
[subscriber sendNext:@"发送信号!"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"取消订阅");
}];
}];
1.创建连接类:
RACMulticastConnection *connection = [signal publish];
2.订阅信号:
[connection.signal subscribeNext:^(id x) {
NSLog(@"1 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"2 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"3 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"4 = %@", x);
}];
3.连接,只有连接了才会把信号源变为热信号:
[connection connect];
4.看打印发现信号类只创建了一次666666
RACDisposable *disposable = [connection.signal subscribeNext:^(id x) {
NSLog(@"apapapa");
}];
[disposable dispose];
}
持续更新............