RAC使用

作者: crazyfox | 来源:发表于2017-06-22 18:37 被阅读162次

什么是RAC

ReactiveCocoa框架具有响应式编程的特点,能精简代码,优化逻辑,去除了协议代理等的引用

RAC能干什么

使用事件流统一了OC的事件处理和异步处理
-委托
-通知
-UIKit事件
-KVO
-回调block

RAC使用示例

1.代替委托

- (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol{}

2.代替通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];

3.代替UIKit事件

[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
}];
[[(UITextView *)text rac_textSignal] subscribeNext:^(id x) {
}];

4.代替KVO

[[button rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
}];

//此方法订阅next事件

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock{}
//如果不想订阅
[(RACDisposable*)disposable dispose];

//多个信号都接收到了才执行selector

- (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals{}

//多播信号 我的理解就是有多处订阅信号,创建信号的block只执行一次

- (void)test {
__block NSUInteger b = a;
RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
b++;
NSLog(@"调用了数据:%@", [NSDate date]);
[subscriber sendNext:nil];
return nil;
}];
RACMulticastConnection *connection = [sourceSignal publish];
[connection.signal subscribeNext:^(id _Nullable x) {
NSString *dataString = [[NSString alloc] initWithData:x encoding:NSUTF8StringEncoding];
NSLog(@"A处调用了数据:%@ b = %ld", dataString,b);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSString *dataString = [[NSString alloc] initWithData:x encoding:NSUTF8StringEncoding];
NSLog(@"B处调用了数据:%@ b = %ld", dataString,b);
}];
[connection connect];
}

输出

2017-06-22 16:43:02.641 ReactiveCocoaTest[16910:634484] 调用了数据:2017-06-22 08:43:02 +0000
2017-06-22 16:43:02.641 ReactiveCocoaTest[16910:634484] A处调用了数据: b = 1
2017-06-22 16:43:02.642 ReactiveCocoaTest[16910:634484] B处调用了数据: b = 1

//RACCommand

[button setRac_command:[[RACCommand alloc] initWithEnabled:nil signalBlock:^RACSignal *(id input) {
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            NSLog(@"Clicked");
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [subscriber sendNext:[[NSDate date] description]];
                [subscriber sendCompleted];
            });
            return [RACDisposable disposableWithBlock:^{
            }];
        }];
    }]];

//bind

UIAlertView alertView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"RAC TEST" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
[[alertView.rac_buttonClickedSignal bind:^RACStreamBindBlock{
return ^RACStream
(id value,BOOL *stop){
return [RACReturnSignal return:[NSString stringWithFormat:@"%@",value]];
};
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];

相关文章

  • IOS RAC实践

    前言 RAC使用-->IOS RAC使用 -- ReactiveObjC 本文使用RAC+MVVM来模拟用户登录 ...

  • RAC(ReactiveCocoa)使用方法(一)

    RAC(ReactiveCocoa)使用方法(一)RAC(ReactiveCocoa)使用方法(二) 什么是RAC...

  • RAC使用

    RAC常用宏 KVO监听使用 RAC宏使用 信号类使用 使用信号模拟代理 rac_sequence遍历字典 解包元...

  • RAC 的使用

    RAC(ReactiveCocoa) 使用详解 RAC 是什么? ReactiveCocoa(RAC) githu...

  • RAC源码解析

    RAC是一个函数响应编程框架。 先来一个简单的RAC使用: RACSignal使用步骤:1.创建信号 + (RAC...

  • RAC(ReactiveCocoa)使用方法(二)

    RAC(ReactiveCocoa)使用方法(一)RAC(ReactiveCocoa)使用方法(二) 上篇文章:R...

  • RAC给UITextField添加代理回调

    使用RAC监听UITextField的文本可以用rac_textSignal,但是rac_textSignal是实...

  • RAC 详细解析

    RAC详细解析(一)—— 框架概览RAC详细解析(二)—— 基础使用方法

  • iOS程序员手写这段代码,当场被聘用

    为什么使用RAC? 因为RAC具有高聚合低耦合的思想所以使用RAC会让代码更简洁,逻辑更清晰。 如何在项目中添加R...

  • 解耦-用RAC处理网络请求

    最近接手的项目中使用了RAC,也研究学习了下,发现使用RAC确实清晰便利了许多,下面记录一下用RAC处理网络请求实...

网友评论

      本文标题:RAC使用

      本文链接:https://www.haomeiwen.com/subject/saqtcxtx.html