CombineLatest、Zip和Merge的区别

信号触发方式

merge

只要merge之后生成的信号被订阅就会自动触发所有压缩信号的订阅回调,如果靠前的信号出现了error后面的信号不再发送。

核心方法:- (instancetype)flatten
值:多次收到,分开的

 1
 2
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 merge:@[s1,s2]] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

阅读全文

Connect

将冷信号包装成热信号,初始化冷信号,调用publish方法会自动生成一个RACMulticastConnection,该对象持有了原始信号和一个热信号。

- (RACMulticastConnection *)publish {
	RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name];
	RACMulticastConnection *connection = [self multicast:subject];
	return connection;
}
- (RACMulticastConnection *)multicast:(RACSubject *)subject {
	[subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name];
	RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject];
	return connection;
}

调用connect方法来触发订阅,注意调用一次触发一次。

阅读全文

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
    }];

阅读全文

作者的图片

董二千

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

iOS Developer

China