RACSignal

创建信号


RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"1"];
        return nil;
    }];

分析

//RACSignal.m
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
	return [RACDynamicSignal createSignal:didSubscribe];
}

阅读全文

SwitchToLatest

- (RACSignal *)switchToLatest- (RACSignal *)flatten的功能类似,都可以将信号中的信号的值取出来。不同的是,前者如果订阅者处理多个信号,只有最后一个信号的值能收到,之前的信号会被销毁。而后者则都能收到所有值。

阅读全文

concat、catchTo、never、takeUntil

  1. - (RACSignal *)concat:(RACSignal *)signal
//源码
- (RACSignal *)concat:(RACSignal *)signal {
	return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
		RACSerialDisposable *serialDisposable = [[RACSerialDisposable alloc] init];

		RACDisposable *sourceDisposable = [self subscribeNext:^(id x) {
			[subscriber sendNext:x];
		} error:^(NSError *error) {
			[subscriber sendError:error];
		} completed:^{
			RACDisposable *concattedDisposable = [signal subscribe:subscriber];
			serialDisposable.disposable = concattedDisposable;
		}];

		serialDisposable.disposable = sourceDisposable;
		return serialDisposable;
	}] setNameWithFormat:@"[%@] -concat: %@", self.name, signal];
}

阅读全文

zip

RACSignal *s1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
       [subscriber sendNext:@"1"];
    return nil;
}];
RACSignal *s2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"2"];
    return nil;
}];
RACSignal *s3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"3"];
    return nil;
}];

RACSignal *zs = [RACSignal zip:@[s1,s2,s3]];

[zs subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

zip压缩的信号只有等所有的自信号都sendNext之后才会执行订阅回调。

问题: 1. 如何确保每个信号都发送完,才执行后压缩信号的订阅回调

阅读全文

信号中的信号-flatten

    RACSignal *targetSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"1"];
        return nil;
    }];
    
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    //发送一个信号
        [subscriber sendNext:targetSignal];
        return nil;
    }];
    
    RACSignal *flattenSignal = [signal flatten];
    [flattenSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);//1
    }];

阅读全文

冷信号和热信号构建触发流程

提到RAC就离不开冷热信号。在实际的开发中如果不理清两者的用法就会出问题。

冷信号像专车,从你打车(订阅)开始,从出发地点(sendNext)发往你在的地方。它是一对一的,不会错过。

热信号像公交车,在你等车(订阅)之前可能已经发车了(sendNext);不仅你可以上,其他人也能上,它是一对多的;错过了这班车(假设只有一班)就没了。

阅读全文

方法替换和Aspects

带着问题看文章:

1.常规姿势的方法替换原理是什么

2.Aspects的方法替换原理是什么

3.为什么这样下面的代码这样hook之后,所有的实例的viewWillAppear:也被hook了

[[UIViewController class] aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionBefore usingBlock:^(){
        
} error:nil];

4.为什么Aspect不能hook静态方法

5.如果用先用Aspects hook了方法A,接着又用MethodSwizzle方法(下文有)对A进行了hook,两个hook都能执行吗?

阅读全文

作者的图片

董二千

愿你走出半生 归来仍是少年

iOS Developer

China