1、RACSubject
RACSubject 这个类是一个信号提供者!他可以充当信号,又能够发送信号,前面我们用RACSignal来创建信号,这次我们用RACSubject创建信号,如下:
//1.创建信号
RACSubject *subject = [RACSubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"接收数据X: %@",x);
}];
//3.发送数据
[subject sendNext:@"JM"];
RACSubject为什么具有创建信号的功能?
我们查看 RACSubject 的头文件发现它继承与 RACSignal,所有它具备了创建信号和发送信号的功能。
#import "RACSignal.h"
#import "RACSubscriber.h"
NS_ASSUME_NONNULL_BEGIN
/// A subject can be thought of as a signal that you can manually control by
/// sending next, completed, and error.
///
/// They're most helpful in bridging the non-RAC world to RAC, since they let you
/// manually control the sending of events.
@interface RACSubject<ValueType> : RACSignal<ValueType> <RACSubscriber>
/// Returns a new subject.
+ (instancetype)subject;
// Redeclaration of the RACSubscriber method. Made in order to specify a generic type.
- (void)sendNext:(nullable ValueType)value;
@end
NS_ASSUME_NONNULL_END
RACSubject *subject = [RACSubject subject];
中的创建信号类方法 subject 到底做了什么事?
发现啥也没干,直接返回了自己,我们再往下看发现它重写了 init 方法,发现它创建了一个可变数据,
+ (instancetype)subject {
return [[self alloc] init];
}
- (instancetype)init {
self = [super init];
if (self == nil) return nil;
_disposable = [RACCompoundDisposable compoundDisposable];
_subscribers = [[NSMutableArray alloc] initWithCapacity:1];
return self;
}
[subject subscribeNext:^(id _Nullable x) {}];
订阅信号做了什么事?
在讲RACSignal的时候我详细说明了这个方法的作用,我这里在简要说明一下,在 订阅信号 的时候它会创建一个 订阅者 在保存传进来的 block,只是这里唯一不同的是 self 变成了 subject,也就是说不同的信号订阅的方式不一样,因为类型不一定调用的方法也就不一样。
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
[subject sendNext:@"JM"]; 发送数据有做了什么事?
点击进入查看 sendNext 的block方式,发现它只是在循环前端 订阅者 的数组并开始遍历,数组中存的就是订阅者对象,然后从新发送
- (void)sendNext:(id)value {
[self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) {
[subscriber sendNext:value];
}];
}
demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo
联系我:
qq: 1245424073
微信: liujunmin6980