最近忙着找工作,发现 iOS 开发人者真是....多。 既然找不到工作就趁着有时间学习一下很火的 ReactiveCocoa 顺便复习下XMPP 。
第一次接触 ReactiveCocoa 建议可以先敲一下 ReactiveCocoa入门教程——第一部分 ReactiveCocoa入门教程——第二部分 dome
下面也是我看过上面的教程实现的,结合XMPP在这里做一个实践,如果有什么错误希望指正,共同提高。
XMPP简单服务器搭建和框架导入就不说了Google 有很多教程。
首先根据上面 ReactiveCocoa 入门教程一做一个响应式的登陆界面 下面过程比较简单就快速带过了 详细布局移步入门教程
1. 托线
@interface ViewController ( )
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *password;
@property (weak, nonatomic) IBOutlet UIButton *login;
@end
2.使用ReactiveCocoa 实现响应链式编程
//过滤条件
-(BOOL)isUsernameTure:(NSString *)text{
return text.length>3;
}
-(BOOL)isPasswordTure:(NSString *)text{
return text.length>2;
}
//过滤无效用户名
RACSignal *validUsernameSignal = [self.username.rac_textSignal map:^id(NSString *value) {
return @([self isUsernameTure:value]);
}];
//过滤无效密码
RACSignal *validPasswordSignal = [self.password.rac_textSignal map:^id(NSString *value) {
return @([self isPasswordTure:value]);
}];
// 设置用户名和密码输入框的背景颜色
RAC(self.username , backgroundColor) = [validUsernameSignal map:^id(NSNumber *value) {
return [value boolValue]? [UIColor whiteColor] :[UIColor redColor];
}];
RAC(self.password , backgroundColor) = [validPasswordSignal map:^id(NSNumber *value) {
return [value boolValue]? [UIColor whiteColor] :[UIColor redColor];
}];
//合并信号
RACSignal *loginActiveSignal = [RACSignal combineLatest:@[validPasswordSignal,validUsernameSignal] reduce:^id(NSNumber *usernameValid,NSNumber *passwordValid){
return @([usernameValid boolValue] && [passwordValid boolValue]);
}];
//按钮可用状态
[loginActiveSignal subscribeNext:^(NSNumber *x) {
self.login.enabled=[x boolValue];
}];
//登陆
[[self.login rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext:^(NSNumber *x) {
}
至此一个大致的登陆界面就完成了 看了入门教程第二部分 可以看到这一句话这里需要注意:subscribeNext:block中使用了self来获取text field的引用。block会捕获并持有其作用域内的值。因此,如果self和这个信号之间存在一个强引用的话,就会造成循环引用。循环引用是否会造成问题,取决于self对象的生命周期。
由于登陆界面登陆成功后就不需要在占据内存所以要解决上述问题避免循环引用
回顾代码进行修改
//按钮可用状态
//修改方法常用下面几种
//__weak ViewController*mySelf=self;
//__weak __typeof(self) mySelf = self;
@weakify(self)
[loginActiveSignal subscribeNext:^(NSNumber *x) {
@strongify(self)
self.login.enabled=[x boolValue];
}];
至此一个响应式的登陆界面就完成了 接下来进行第二部分 会对XMPP 进行改进
完整[Dome](https://github.com/ofEver/XMPP-ReactiveCocoa)