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
订阅者
调用didSubscribe
blcok,会通过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
会产生副作用
每订阅一次,就会执行didSubscribe
block,也就会打印执行网络请求,在做网络请求的时候,我们是不希望的每订阅一次,执行网络请求的
解决副作用的方法如下
- (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
网友评论