ReactiveCocoa的学习笔记
最近看了一些关于ReactiveCocoa的东西,现将其纪录下来。 ReactiveCocoa是由Github工程师们开发的一个应用于iOS和OS X开发的函数响应式编程新框架。 信号源(RACSignal) - (RACDisposable *)subscribe:(id)subscriber {
NSCAssert(NO,@"This method must be overridden by subclasses");
return nil;
}
订阅者(RACSubscriber) RACSignal *signal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
NSLog(@"triggered");
[subscriber sendNext:@"signal"];
[subscriber sendCompleted];
return nil;
}];
订阅信号,使信号处于热状态,如下代码: [[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
NSLog(@"triggered");
[subscriber sendNext:@"signal"];
[subscriber sendCompleted];
return nil;
}] subscribeCompleted:^{
NSLog(@"subscription");
}];
ReactiveCocoa框架中常见Category UITextField+RACSignalSupport.h
UIButton+RACCommandSupport.h
UIAlertView+RACSignalSupport.h
...
常用的UIKit框架中的类也都有添加相应的Category。比如UIAlertView,利用RAC提供的分类就不需要再用Delegate了。 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"Alert" delegate:nil cancelButtonTitle:@"YES" otherButtonTitles:@"NO",nil];
[[alertView rac_buttonClickedSignal] subscribeNext:^(NSNumber *indexNumber) {
if ([indexNumber intValue] == 1) {
NSLog(@"you selected NO");
} else {
NSLog(@"you selected YES");
}
}];
[alertView show];
其他常见类的Category NSArray+RACSequenceAdditions.h
NSDictionary+RACSequenceAdditions.h
NSNotificationCenter+RACSupport.h
...
数据转换 [[[self.testTextField.rac_textSignal
map:^id(NSString* text){
return @(text.length);
}]
filter:^BOOL(NSNumber*length){
return[length integerValue] > 5;
}]
subscribeNext:^(id x){
NSLog(@"%@",x);
}];
map以NSString为输入,取字符串的长度,返回一个NSNumber。对传入的NSNumber类型数据,使用filter进行过滤,在输入数据后,当字符个数大于5时,打印出来的是所有大于5的数字。 RAC(self.logInButton,enabled) = [RACSignal
combineLatest:@[
self.usernameTextField.rac_textSignal,self.passwordTextField.rac_textSignal
] reduce:^(NSString *username,NSString *password,NSNumber *loggingIn,NSNumber *loggedIn) {
return @(username.length > 0 && password.length > 0 );
}];
RAC(self.logInButton,enabled)运用到了RAC中定义的宏,RAC宏允许直接把信号的输出应用到对象的属性上。RAC宏有两个参数,第一个是需要设置属性值的对象,第二个是属性名。每次信号产生一个next事件,传递过来的值都会应用到该属性上。使用combineLatest:reduce:方法把上面的两个信号聚合在一起,并生成一个新的信号。每次这两个源信号的任何一个产生新值时,reduce block都会执行,block的返回值会发给下一个信号。RACsignal的这个方法可以聚合任意数量的信号,reduce 中block的参数和每个源信号相关。 参考的资料: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |