1.RAC中RacsignalRACSignal的用法
- (void)signal
{
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"网络请求中..");
[subscriber sendNext:@"111"];
return nil;
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"-----%@",x);
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"-------%@",x);
}];
}
调用流程
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"网络请求中..");
[subscriber sendNext:@"111"];
return nil;
}];
会保存这个block到 RACDynamicSignal类 didSubscribe的属性中
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"-----%@",x);
}];
会保存这个block到RACSubscriber类的next属性中,然后再RACDynamicSignal类的subscribe方法中调用以前保存好的didSubscribe的block,且传入RACPassthroughSubscriber订阅者
调用didSubscribeblcok,会通过RACScheduler这个类去调度
NSLog(@"网络请求中..");
[subscriber sendNext:@"111"];
return nil;
subscriber 也就是RACPassthroughSubscriber对象,[self.innerSubscriber sendNext:value]; innerSubscriber也就是保存nextblock属性的RACSubscriber对象,在调用
@synchronized (self) {
void (^nextBlock)(id) = [self.next copy];
if (nextBlock == nil) return;
nextBlock(value);
}
}
nextblock 也就执行了
2.为什么sendCompleted和 sendError 后面再sendNext,却不会执行了nextblock
通过看sendCompleted和sendError实现方法得知
- (void)sendError:(NSError *)e {
@synchronized (self) {
void (^errorBlock)(NSError *) = [self.error copy];
[self.disposable dispose];
if (errorBlock == nil) return;
errorBlock(e);
}
}
订阅者被销毁了。
3.RACSignal会产生副作用
每订阅一次,就会执行didSubscribeblock,也就会打印执行网络请求,在做网络请求的时候,我们是不希望的每订阅一次,执行网络请求的
解决副作用的方法如下
- (void)muilticas
{
/// 解决多次订阅的问题,。 `副作用`
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"发送网络请求");
[subscriber sendNext:@"111"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁啦");
}];
}];
RACMulticastConnection *connect = [signal publish];
[connect.signal subscribeNext:^(id _Nullable x) {
NSLog(@"1======%@",x);
}];
[connect.signal subscribeNext:^(id _Nullable x) {
NSLog(@"2======%@",x);
}];
[connect connect];
}
调用流程就不讲了,涉及到RACSubject