图解ReactiveCocoa基本函数
关于函数响应式编程(FRP),可以参考
ReactiveCocoa repo上最简单的一句话对FRP做了本质的描述,而repo本身提供的是APIs of composing and transforming streams of values,而Streams of values的抽象在ReactiveCocoa中应该是RACStream,而要composing and transforming是本文想要描述的核心内容。 先解释ReactiveCocoa中的两个基本概念
filterRACSignal *signal = [@[ @1,@2,@3 ] rac_sequence].signal; signal = [signal filter:^BOOL(NSNumber *value) {
return value.integerValue % 2;
}];
[signal subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value);
}];
mapRACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @4,@5 ] rac_sequence].signal;
[[signal1 merge:signal2] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
mergeRACSignal *signal1 = [@[ @1,value); }];
combineLatestRACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @3,@4 ] rac_sequence].signal;
[[signal1 combineLatestWith:signal2] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
combineLatest & reduceRACSignal *signal1 = [@[ @1,@4 ] rac_sequence].signal;
[[[signal1 combineLatestWith:signal2]
reduceEach:^id(NSNumber *v1,NSNumber *v2) {
return @(v1.integerValue * v2.integerValue);
}] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
flattenRACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [RACSignal return:signal1];
[[signal2 flatten] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
flattenMapRACSignal *signal = [@[ @1,@2 ] rac_sequence].signal;
[[signal flattenMap:^RACStream *(NSNumber *value) {
return [RACSignal return:@(value.integerValue * 2)];
}] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value);
}];
not replayRACSubject *letters = [RACSubject subject];
RACSignal *signal = letters;
[signal subscribeNext:^(id x) {
NSLog(@"S1: %@",x);
}];
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
NSLog(@"S2: %@",x);
}];
[letters sendNext:@"C"];
replayRACSubject *letters = [RACReplaySubject subject];
RACSignal *signal = letters;
[signal subscribeNext:^(id x) {
NSLog(@"S1: %@",x);
}];
[letters sendNext:@"A"];
[signal subscribeNext:^(id x) {
NSLog(@"S2: %@",x);
}];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
NSLog(@"S3: %@",x);
}];
[letters sendNext:@"C"];
replayLastRACSubject *letters = [RACSubject subject];
RACSignal *signal = [letters replayLast];
[signal subscribeNext:^(id x) {
NSLog(@"S1: %@",x);
}];
[letters sendNext:@"C"];
replayLazilyRACSubject *letters = [RACSubject subject];
RACSignal *signal = [letters replayLazily];
[letters sendNext:@"A"];
[signal subscribeNext:^(id x) {
NSLog(@"S1: %@",x);
}];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
NSLog(@"S2: %@",x);
}];
[letters sendNext:@"C"];
[signal subscribeNext:^(id x) {
NSLog(@"S3: %@",x);
}];
[letters sendNext:@"D"];
zipRACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSignal *combined =
[RACSignal zip:@[ letters,numbers ]
reduce:^(NSString *letter,NSString *number) {
return [letter stringByAppendingString:number];
}];
// Outputs: A1 B2 C3
[combined subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[letters sendNext:@"C"];
[numbers sendNext:@"1"];
[numbers sendNext:@"2"];
[numbers sendNext:@"3"];
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |