本文讨论仅限于ReactiveCocoa v2.5
关于函数响应式编程(FRP),可以参考
- What is (functional) reactive programming?
- Specification for a Functional Reactive Programming language
Streams of values over time
ReactiveCocoa repo上最简单的一句话对FRP做了本质的描述,而repo本身提供的是APIs of composing and transforming streams of values,而Streams of values的抽象在ReactiveCocoa中应该是RACStream,而要composing and transforming是本文想要描述的核心内容。
先解释ReactiveCocoa中的两个基本概念
信号(Signal) a signal is a steam of values,signals can be transformed,combined,etc.
订阅者(Subscriber) a subscriber subscribes to a signal. RAC lets blocks,objects,and properties subscribe to signals
filter
RACSignal *signal = [@[ @1,@2,@3 ] rac_sequence].signal; signal = [signal filter:^BOOL(NSNumber *value) {
return value.integerValue % 2;
}];
[signal subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value);
}];
map
RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @4,@5 ] rac_sequence].signal;
[[signal1 merge:signal2] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
merge
RACSignal *signal1 = [@[ @1,value); }];
combineLatest
RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @3,@4 ] rac_sequence].signal;
[[signal1 combineLatestWith:signal2] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
combineLatest & reduce
RACSignal *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); }];
flatten
RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [RACSignal return:signal1];
[[signal2 flatten] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value); }];
flattenMap
RACSignal *signal = [@[ @1,@2 ] rac_sequence].signal;
[[signal flattenMap:^RACStream *(NSNumber *value) {
return [RACSignal return:@(value.integerValue * 2)];
}] subscribeNext:^(NSNumber *value) {
NSLog(@"%@",value);
}];
not replay
RACSubject *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"];
replay
RACSubject *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"];
replayLast
RACSubject *letters = [RACSubject subject];
RACSignal *signal = [letters replayLast];
[signal subscribeNext:^(id x) {
NSLog(@"S1: %@",x);
}];
[letters sendNext:@"C"];
replayLazily
RACSubject *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"];
zip
RACSubject *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"];
原文地址:https://www.jb51.cc/react/305777.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。