Reactivecocoa 简单用法
ReactiveCocoa(其简称为 RAC)是由 Github 开源的一个应用于 iOS 和 OS X 开发的新框架。RAC 具有函数式编程和响应式编程的特性,所以ReactiveCocoa被描述为函数响应式编程(FRP)框架。用起来简洁方便。
ReactiveCocoa 主要由以下四大核心组件构成:
- 信号源:
RACStream
及其子类; - 订阅者:
RACSubscriber
的实现类及其子类; - 调度器:
RACScheduler
及其子类; - 清洁工:
RACDisposable
及其子类。
信号源是最核心的部分
ReactiveCocoa开发中常见用法。
代替代理:
rac_signalForSelector:
用于替代代理。代替KVO :
rac_valuesAndChangesForKeyPath:
用于监听某个对象的属性改变。监听事件:
rac_signalForControlEvents:
用于监听某个事件。代替通知:
rac_addObserverForName:
用于监听某个通知。监听文本框文字改变:
rac_textSignal:
只要文本框发出改变就会发出这个信号。处理当界面有多次请求时,需要都获取到数据时,才能展示界面
rac_liftSelector:withSignalsFromArray:Signals:
当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。
使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。// 代理方法 [[self rac_signalForSelector:@selector(webViewDidStartLoad:) fromProtocol:@protocol(UIWebViewDelegate)] subscribeNext:^(id x) { // 实现 webViewDidStartLoad: 代理方法 }]; // target-action [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *avatarButton) { // avatarButton 被点击了 }]; // 通知 [[[NSNotificationCenter defaultCenter] rac_addObserverForName:kReachabilityChangedNotification object:nil] subscribeNext:^(NSNotification *notification) { // 收到 kReachabilityChangedNotification 通知 }]; // KVO [RACObserve(self, username) subscribeNext:^(NSString *username) { // 用户名发生了变化 }]; [[self rac_valuesAndChangesForKeyPath:@"username" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"%@",x); }]; // 监听文本框的文字改变 [_textField.rac_textSignal subscribeNext:^(id x) { NSLog(@"文字改变了%@",x); }]; //处理多个请求,都返回结果的时候,统一做处理. RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求1 [subscriber sendNext:@"发送请求1"]; return nil; }]; RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求2 [subscriber sendNext:@"发送请求2"]; return nil; }]; // 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。 [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]]; }
然而,这些还只是
ReactiveCocoa
的冰山一角,它真正强大的地方在于我们可以对这些不同的信号进行任意地组合和链式操作[[[RACSignal combineLatest:@[ RACObserve(self, username), RACObserve(self, password)] reduce:^(NSString *username, NSString *password) { return @(username.length > 0 && password.length > 0); }] distinctUntilChanged] subscribeNext:^(NSNumber *valid) { if (valid.boolValue) { // 用户名和密码合法,登录按钮可用 } else { // 用户名或密码不合法,登录按钮不可用 } }];
ReactiveCocoa常见宏
RAC(TARGET, [KEYPATH, [NIL_VALUE]]):
用于给某个对象的某个属性绑定。// 只要文本框文字改变,就会修改label的文字
RAC(self.labelView,text) = _textField.rac_textSignal;
RACObserve(self, name):
监听某个对象的某个属性,返回的是信号。[RACObserve(self.view, center) subscribeNext:^(id x) { NSLog(@"%@",x); }];
@weakify(Obj)和@strongify(Obj),一般两个都是配套使用,在主头文件(ReactiveCocoa.h)中并没有导入,需要自己手动导入,RACEXTScope.h才可以使用。但是每次导入都非常麻烦,只需要在主头文件自己导入就好了。
RACTuplePack:
把数据包装成RACTuple(元组类)// 把参数中的数据包装成元组 RACTuple *tuple = RACTuplePack(@10,@20);
RACTupleUnpack:
把RACTuple(元组类)解包成对应的数据。// 把参数中的数据包装成元组 RACTuple *tuple = RACTuplePack(@"xmg",@20); // 解包元组,会把元组的值,按顺序给参数里面的变量赋值 // name = @"xmg" age = @20 RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
详细教程请参考:
最后更新: 2023年03月25日 22:39:55
本文链接: http://aeronxie.github.io/post/fcb0e9b2.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!