实现在pod中导入
platform :ios,'8.0'
target ‘demo’ do
pod 'ReactiveObjC'
end
这里需要注意,如果是oc和swift同时存在里面要添加use_frameworks!
我们引入大量第三方时候可能有许多报黄信息,添加 inhibit_all_warnings!可以屏蔽掉提示
然后就是在工程中引入#import <ReactiveObjC.h>或#import<ReactiveObjC/ReactiveObjC.h>有哪个引入哪个就可以
1、Textfield监听输入
/* 监听 TextField 的输入(内容改变就会调用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
2、根据条件输出
/* 添加监听条件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length==11; // 表示输入手机号是11位 时才会调用下面的 block
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
3、button点击事件
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@ 按钮被点击了", x);
// x 是 button 按钮对象
}];
4、根据textfiled决定button是否可以点击(这里只要求两个输入框有内容就可以点击)
RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){
return @(username.length && password.length);
}];
新的方法使用可能有一些改变
@weakify(self)
RAC(_loginButton,enabled) = [RACSignal combineLatest:@[_username,_password] reduce:^id _Nonnull{
@strongify(self)
return @(self.username.text.length && self.password.text.length);
}];
5、监听Notification(不要忘记通知还是需要我们自己去清除,在dealloc中清除。感觉也没省下啥步骤,只是改成block)
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@ 键盘弹起", x); // x 是通知对象
}];
6、代替代理方法delegate(比如在view中有个button按钮,存在点击事件)(@selector(btnClick) 也可替换成@selector(btnClick:))
[[view rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@" view 中的按钮被点击了");
}];
7、代替KVO监听
[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
简写
[RACObserve(view, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
8、代替NSTimer事件计算器
(1)、 [[[RACSignal interval:2.0f onScheduler:[RACScheduler mainThreadScheduler]]takeUntil:self.rac_willDeallocSignal]subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"每2秒跳动一次");
}];
(2)、 [[RACScheduler mainThreadScheduler]afterDelay:2.0f schedule:^{
NSLog(@"2秒之后执行");
}];
9、便利字典
/* 遍历字典 */
NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"}; [dictionary.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
RACTupleUnpack(NSString *key, NSString *value) = x;
// x 是一个元祖,这个宏能够将 key 和 value 拆开
NSLog(@"字典内容:%@:%@", key, value);
}];
10、便利数组
/* 遍历数组 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"数组内容:%@", x);
// x 可以是任何对象
}];
/* 内容操作 */ NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence map:^id _Nullable(id _Nullable value) {
NSLog(@"数组内容:%@", value);
return @"0"; // 将所有内容替换为 0
}] array];
/* 内容快速替换 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence mapReplace:@"0"] array]; // 将所有内容替换为 0
后期有时间会做一个登录的demo,这里边只是一些使用方法,如果想知道原理请查找其他人的博客。