函数式响应式编程框架ReactiveCocoa总结
ReactiveCocoa与函数响应式编程 命令式编程vs函数式响应式编程 ReactiveCocoa使用 //target--action
[[textField rac_textSignal] subscribeNext:^(UITextField *textField) {
NSLog(@"%@",textField);
}];
[[textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(UITextField *field) {
NSLog(@"%@",field.text);
}];
//notification
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"111" object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[[NSNotificationCenter defaultCenter] postNotificationName:@"111" object:@"111"];
//kvo
[RACObserve(self,title) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
self.title = @"xxxx";
//delegate
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"gogogo" message:@"gogogo" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil];
[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {
NSLog(@"%@",tuple.first);
NSLog(@"%@",tuple.second);
NSLog(@"%@",tuple.third);
}];
[alertView show];
//冷信号 创建信号 发送信号 订阅信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"发送值"];
return [RACScopedDisposable disposableWithBlock:^{
NSLog(@"被销毁");
}];
}];
[signal subscribeNext:^(id x) {
NSLog(@"接受到信号的值");
}];
//热信号 创建 订阅 发送信号
RACSubject *subject = [RACSubject subject];
[subject subscribeNext:^(id x) {
NSLog(@"收到发送的信号");
}];
[subject subscribeNext:^(id x) {
NSLog(@"收到发送的信号");
}];
[subject sendNext:@"22222"];
//元组 遍历 效率太差 慎用
NSArray *array = @[@"123",@"1234",@"2356"];
[array.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//RACCOMMAND
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"hhahahahah"];
return [RACDisposable disposableWithBlock:^{
}];
}];
return signal;
}];
[command execute:@"111"];
//Racmuticastconnection
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"hhahahahah"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"-----");
}];
}];
RACMulticastConnection *connection = [signalA publish];
[connection.signal subscribeNext:^(id x) {
NSLog(@"----------------x");
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"-----------------x");
}];
[connection connect];
//常用的宏定义
[[RACObserve(self,title) replayLazily] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//绑定
RAC(self,title) = [textField.rac_textSignal replayLazily];
[textField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[[[textField rac_textSignal] bind:^RACStreamBindBlock{
return ^RACStream *(id value,BOOL *stop) {
return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];
};
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//MAP
[[textField.rac_textSignal map:^id(id value) {
return [NSString stringWithFormat:@"22222%@",value];
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
/// faltenmap
[[textField.rac_textSignal flattenMap:^RACStream *(id value) {
return [RACReturnSignal return:value];
}] subscribeNext:^(id x) {
NSLog(@"dsdddd%@",x);
}];
//contact 先发送信号a ,型号a发送完成 才发送 signal
RACSignal *signacContact = [signalA concat: signal];
[signacContact subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//merge 多个信号合并为一个信号,任何一个信号有新值都会调用
RACSignal *signacMerge = [signalA merge:signal];
[signacMerge subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//zipwith 合并两个信号,并把两个信号内容合并为元组
RACSignal *zipSignal = [signalA zipWith:signal];
[zipSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//过滤
[textField.rac_textSignal filter:^BOOL(NSString *value) {
return value.length > 3;
}];
[textField.rac_textSignal ignore:@"3"];
[[textField.rac_textSignal distinctUntilChanged] subscribeNext:^(id x) {
}];
[[textField.rac_textSignal skip:3] subscribeNext:^(id x) {
}];
[[textField.rac_textSignal takeLast:3] subscribeNext:^(id x) {
}];
[textField.rac_textSignal takeUntil:signal];
//秩序
[[textField.rac_textSignal doNext:^(id x) {
}] doCompleted:^{
}];
//多线程 racSchedule
[[RACScheduler scheduler] afterDelay:0 schedule:^(void) {
}];
[[signal deliverOn:[RACScheduler scheduler]] subscribeNext:^(id x) {
}];
[signal subscribeOn:[RACScheduler scheduler]];
//时间 timeout delay interval
[textField.rac_textSignal timeout:0.01 onScheduler:[RACScheduler currentScheduler]];
[textField.rac_textSignal delay:1.0];
[textField.rac_textSignal subscribeError:^(NSError *error) {
NSLog(@"error");
}];
[[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] subscribeNext:^(id x) {
NSLog(@"FDF");
}];
//RAC之重复 replay replaylazily
RACSignal *signal_replay = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"1111"];
return nil;
}] replayLazily];
[signal_replay subscribeNext:^(id x) {
NSLog(@"22222");
}];
[signal_replay subscribeNext:^(id x) {
NSLog(@"22222");
}];
//replaylast
RACSubject *subjectaaa = [RACSubject subject];
RACSignal *signalaaaaa = [subjectaaa replayLast];
[subjectaaa sendNext:@"1111"];
[subjectaaa sendNext:@"33333"];
[signalaaaaa subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subjectaaa sendNext:@"333"];
[signalaaaaa subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
@weakify(self)
[subjectaaa subscribeNext:^(id x) {
@strongify(self);
}];
踩坑总结 //1.RACObserve 带来的循环引用
[subjectaaa subscribeNext:^(id x) {
@strongify(self)
RACObserve(self,title);
}];
//RACSubject 进行了 map、filter、merge、combineLatest、flattenMap转换操作后,要发送complete ,不然无法释放
[[subjectaaa map:^id(NSNumber *value) {
return @([value integerValue] *3);
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subjectaaa sendNext:@(123)];
[subjectaaa sendCompleted];
//signal造成的多次订阅问题,使用reply,replayLazily让subscriber里面的代码只被执行一次
小结 属性 Racchannel 本质是一个signal RAC宏 : 将信号产生的值和rac括号内的值绑定 什么场景使用rac 副作用消除 frp思维 小技巧 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |