一,RACSignal
//1,创建一个冷信号,这个时候会把代码存储到block中,当第二步订阅信号的时候会调用block内容(如果需要传递数据过去,用subscriber进行即可,如下)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
NSLog(@"ok, excute me");
[subscriber sendNext:@"I am the subscriber sending message"];
return nil;
}];
//2,订阅信号,使冷信号变热信号,这个时候会调用之前保存的代码并执行block
[signal subscribeNext:^(id x) {
NSLog(@"I got a message from subscriber");
//x是信号中传递过来的信息
NSLog(@"%@",x);
}];
二,RACDisposal
1,RACDisposal会自动取消订阅
//RACDisposal(用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候就会自动触发)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//这里需要注意一下,RACSubscriber是一个协议,只要遵守协议就可以成为订阅者
NSLog(@"ok,这里是暂时保存的block");
[subscriber sendNext:@"发送数据"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"在这里自动取消订阅,清空资源等等");
//如果不想在这个时候取消而是需要在特定时刻手动取消订阅,需要强引用subscriber这个对象
}];
}];
[signal subscribeNext:^(id x) {
//订阅之后就可以接收数据了
NSLog(@"%@",x);
}];
2,RACDisposal手动取消订阅
//1,创建信号并强引用subscriber
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//这里需要注意一下,RACSubscriber是一个协议,只要遵守协议就可以成为订阅者
self.subscriber = subscriber;
NSLog(@"ok,这里是暂时保存的block");
[subscriber sendNext:@"发送数据"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"手动取消订阅,会来到这里,清空资源等等");
}];
}];
//2,取出订阅方法返回值
RACDisposable *disposable = [signal subscribeNext:^(id x) {
//订阅之后就可以接收数据了
NSLog(@"%@",x);
}];
//3,用订阅返回值手动取消订阅
[disposable dispose];
三,RACSubject
/*
RACSubject之所以发送数据,是因为它遵守了<RACSubscriber>,作为一个遵守了<RACSubscriber>协议的RACSignal的子类,所以说它既可以创建信号,自身又可以发送数据
*/
//1,创建信号
RACSubject *subject = [RACSubject subject];
//2,订阅信号
[subject subscribeNext:^(id x) {
NSLog(@"订阅者01接收到数据------%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"订阅者02接收到数据------%@",x);
}];
//3, 发送信号数据
[subject sendNext:@"ok, message send"];
四,RACReplaySubject
-
RACReplaySubject和RACSubject的不同之处在于:/*
1,RACReplaySubject在发送信号数据的时候只是保存block,并没有遍历自身的订阅着执行block,而RACSubject在发送数据的时候就已经遍历了自身订阅者执行block
2,因此,RACSubject必须要在发送数据的之前创建订阅者,也就是需要在发送数据之前订阅信号(订阅信号的时候创建订阅者),而RACReplaySubject则可以先发送数据,之后再订阅信号,因为它在发送数据的时候只是保存block,真正调用时在订阅者创建之后才会重新激活调用发送数据的block
*/
//1,创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
//4,也可以先发送数据
[replaySubject sendNext:@"先发送数据,后订阅也可以"];
//2,订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"订阅者01接受到数据----%@",x);
}];
[replaySubject subscribeNext:^(id x) {
NSLog(@"订阅者02接受到数据----%@",x);
}];
//3, 发送信号数据
[replaySubject sendNext:@"ok, message send"];