函数式、响应式编程(Functional Reactive Programming)现在很火。网上的介绍也不少了。为了区别于其他教程,我这里用几个简单的例子让你马上可以投入使用。都是很常见的任务。下面操作假定你已经了解CocoaPods,现在管理库基本都用这个东西,很好用。
准备
导入ReactiveCocoa
pod "ReactiveCocoa"
安装
pod update
导入头文件
建议在pch导入,全局使用。
#import <ReactiveCocoa/ReactiveCocoa.h>
使用
UIButton单击事件
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"按钮单击");
}];
监视UITextField内容变化
[[self.field rac_textSignal] subscribeNext:^(id x) { NSLog(@"UITextField: %@",x);
}];
监视UISwitch值变化
[[self.switchControl rac_newOnChannel] subscribeNext:^(id x) { NSLog(@"UISwitch: %@",x);
}];
通知
你不再需要再为每个通知指定一个selector,一个方法搞定。
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidBecomeActiveNotification object:nil] subscribeNext:^(id x) { NSLog(@"UIApplicationDidBecomeActiveNotification");
}];
对其他对象的keyPath的值跟踪
UIView.frame
[RACObserve(self.view,frame) subscribeNext:^(id x) {
NSLog(@"self.view.frame: %@",x);
}];
UIScrollView.contentOffset
[RACObserve(scrollView,contentOffset) subscribeNext:^(@"scrollView.contentOffset: %@",x);
}];
绑定一个值
RAC(.button,enabled) =
[RACSignal combineLatest:@[.usernameField.rac_textSignal,.passwordField.rac_textSignal]
reduce:^(NSString *username,NSString *password) {
return @(username.length && password.length);
}];
如果你已经试过上面的几个例子,那么恭喜你,你已经入门了。