ReactiveCocoa简介四,Button的点击事件的实现

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa简介四,Button的点击事件的实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

从按钮的UIControlEventTouchUpInside事件创建了一个信号,然后添加了一个订阅,在每次事件发生时都会输出log。

[[self.signInButton
   rac_signalForControlEvents:UIControlEventTouchUpInside]
   subscribeNext:^(id x) {
     NSLog(@"button clicked");
   }];

现在按钮有了点击事件的信号,下一步就是把它和登录流程连接起来。

使用map方法,把按钮点击信号转换成了登录信号。subscriber输出log。

[[[self.signInButton
   rac_signalForControlEvents:UIControlEventTouchUpInside]
   map:^id(id x){
     return[self signInSignal];
   }]
   subscribeNext:^(id x){
     NSLog(@"Sign in result: %@",x);
   }];

上面的有问题,因为信号中包含信号即:信号中的信号flattenMap

</pre></p><p><span style="color:rgb(37,250)"><span style="color:rgb(37,250)"></span></span><div style="margin: 0px; padding: 0px; color: rgb(37,37); font-family: 'Helvetica Neue',serif; font-size: 14px;"><div id="Highlighter_66496" class="SyntaxHighlighter  js" style="padding: 0px; margin: 1em 0px !important; width: 100% !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><span style="color: rgb(37,serif; font-size: 14px; background-color: rgb(250,250);">只需要把map操作改成flattenMap就可以了:</span><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; width: 100% !important; border: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; Box-sizing: content-Box !important; font-family: Consolas,monospace !important; font-size: 1em !important; min-height: inherit !important;"><tbody style="border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; Box-sizing: content-Box !important; font-size: 1em !important; min-height: inherit !important;"><tr style="border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; Box-sizing: content-Box !important; font-size: 1em !important; min-height: inherit !important;"><td class="code" style="margin: 0px !important; padding: 0px !important; border: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 100% !important; Box-sizing: content-Box !important; font-family: Consolas,monospace !important; font-size: 1em !important; min-height: inherit !important;"><div class="container" style="margin: 0px !important; padding: 0px !important; min-height: inherit !important; height: auto !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; Box-sizing: content-Box !important; font-size: 1em !important;"><div class="line number1 index0 alt2" style="margin: 0px !important; padding: 0px 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; Box-sizing: content-Box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important;"><pre name="code" class="objc">[[[self.signInButton
   rac_signalForControlEvents:UIControlEventTouchUpInside]
   flattenMap:^id(id x){
     return[self signInSignal];
   }]
   subscribeNext:^(id x){
     NSLog(@"Sign in result: %@",x);
   }];

最终结果
[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
flattenMap:^id(id x){
   return[self signInSignal];
}]
subscribeNext:^(NSNumber*signedIn){
   BOOL success =[signedIn boolValue];
   self.signInFailureText.hidden = success;
   if(success){
     [self performSegueWithIdentifier:@"signInSuccess" sender:self];
   }
  }];

用信号量封装一个方法

- (RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id subscriber){
   [self.signInService 
     signInWithUsername:self.usernameTextField.text
               password:self.passwordTextField.text
               complete:^(BOOL success){
                    [subscriber sendNext:@(success)];
                    [subscriber sendCompleted];
     }];
   return nil;
}];
}

猜你在找的React相关文章