- @interfaceViewController()
- @property(weak,nonatomic)IBOutletUITextField*accountField;
- UITextField*pwdField;
- UIButton*loginBtn;
- @end
- @implementationViewController
- -(void)viewDidLoad{
- [superviewDidLoad];
- //Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
- selfconcat];
- }
- //把多个信号聚合成你想要的信号,使用场景----:比如-当多个输入框都有值的时候按钮才可点击。
- //思路---就是把输入框输入值的信号都聚合成按钮是否能点击的信号。
- -(void)combineLatest{
- RACSignal*combinSignal=[RACSignalcombineLatest:@[self.accountField.rac_textSignal,153); background-color:inherit; font-weight:bold">self.pwdField.rac_textSignal]reduce:^id(NSString*account,153); background-color:inherit; font-weight:bold">NSString*pwd){//reduce里的参数一定要和combineLatest数组里的一一对应。
- //block:只要源信号发送内容,就会调用,组合成一个新值。
- NSLog(@"%@%@",account,pwd);
- return@(account.length&&pwd.length);
- }];
- ////订阅信号
- //[combinSignalsubscribeNext:^(idx){
- //self.loginBtn.enabled=[xboolValue];
- //}];//----这样写有些麻烦,可以直接用RAC宏
- RAC(self.loginBtn,enabled)=combinSignal;
- /*
- RACSignal*signal=[RACSignalcombineLatest:@[self.accountField.rac_textSignal,self.pwdField.rac_textSignal]reduce:^id(NSString*string1,NSString*string2){
- return@(string1.length&&string2.length);
- }];
- RAC(self.loginBtn,selected)=signal;
- */
- }
- void)zipWith{
- //zipWith:把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元祖,才会触发压缩流的next事件。
- //创建信号A
- RACSubject*signalA=[RACSubjectsubject];
- //创建信号B
- RACSubject*signalB=[RACSubject//压缩成一个信号
- //**-zipWith-**:当一个界面多个请求的时候,要等所有请求完成才更新UI
- //等所有信号都发送内容的时候才会调用
- RACSignal*zipSignal=[signalAzipWith:signalB];
- [zipSignalsubscribeNext:^(idx){
- NSLog(@"%@",x);//所有的值都被包装成了元组
- //发送信号交互顺序,元组内元素的顺序不会变,跟发送的顺序无关,而是跟压缩的顺序有关[signalAzipWith:signalB]---先是A后是B
- [signalAsendNext:@1];
- [signalB@2];
- //任何一个信号请求完成都会被订阅到
- //merge:多个信号合并成一个信号,任何一个信号有新值就会调用
- void)merge{
- //创建信号A
- subject];
- //创建信号B
- //组合信号
- RACSignal*mergeSignal=[signalAmerge:signalB];
- //订阅信号
- [mergeSignal//发送信号---交换位置则数据结果顺序也会交换
- sendNext:@"下部分"];
- sendNext:@"上部分"];
- //then---使用需求:有两部分数据:想让上部分先进行网络请求但是过滤掉数据,然后进行下部分的,拿到下部分数据
- void)then{
- RACSignal*signalA=[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){
- //发送请求
- NSLog(@"----发送上部分请求---afn");
- [subscribersendNext:@"上部分数据"];
- [subscribersendCompleted];//必须要调用sendCompleted方法!
- returnnil;
- //创建信号B,
- RACSignal*signalsB=[RACSignal NSLog(@"--发送下部分请求--afn");
- sendNext:@"下部分数据"];
- sendCompleted];
- nil;
- }];
- //创建组合信号
- //then;忽略掉第一个信号的所有值
- RACSignal*thenSignal=[signalAthen:^RACSignal*{
- //返回的信号就是要组合的信号
- returnsignalsB;
- [thenSignal//concat-----使用需求:有两部分数据:想让上部分先执行,完了之后再让下部分执行(都可获取值)
- void)concat{
- //组合
- //NSLog(@"----发送上部分请求---afn");
- //NSLog(@"--发送下部分请求--afn");
- //concat:按顺序去链接
- //**-注意-**:concat,第一个信号必须要调用sendCompleted
- //创建组合信号
- RACSignal*concatSignal=[signalAconcat:signalsB];
- //订阅组合信号
- [concatSignal }