美文网首页RAC快速入门
RAC Day3 RAC为UIKit提供的信号以及其他额外信号

RAC Day3 RAC为UIKit提供的信号以及其他额外信号

作者: 帅气的阿斌 | 来源:发表于2020-10-16 17:26 被阅读0次

Day1 Day2 中介绍了RAC的常见用法,本篇将继续介绍RAC在项目实战中,常用到的RACUIKit提供的信号即方法

1.KVO
- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer

2.UIControl/UIButton

  • 返回点击等事件的信号
    - (RACSignal<__kindof UIControl *> *)rac_signalForControlEvents:(UIControlEvents)controlEvents;

3.UITextField/UITextView

  • text改变的信号
    - (RACSignal<NSString *> *)rac_textSignal;

4.UITableViewCell/UITableViewHeaderFooterView

  • 返回cell准备进入复用池的信号,这个信号一般用于在cellforindexpath方法中,避免cell重复订阅信号
    @property (nonatomic, strong, readonly) RACSignal<RACUnit *> *rac_prepareForReuseSignal;

5.NSNotificationCenter 好处是object可选,如果为nil,则无需关心监听者释放问题(dealloc 无需移除通知监听)
- (RACSignal<NSNotification *> *)rac_addObserverForName:(nullable NSString *)notificationName object:(nullable id)object;

6.监听方法/代理和代替代理(仅限于无返回值的代理 比如UITableViewtableView:didSelectRowAtIndexPath:)

  • 监听方法
    - (RACSignal<RACTuple *> *)rac_signalForSelector:(SEL)selector;
  • 这个是单独用来监听代理方法的
    - (RACSignal<RACTuple *> *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol;
    e.g:
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = UIColor.blueColor;
    
    _tbView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    _tbView.frame = self.view.bounds;
    [self.view addSubview:_tbView];
    
//    ❌如果先于rac_signalForSelector设置代理或导致信号订阅失效
//原因=》在设置代理的时候,系统会缓存这个代理对象实现了哪些代码方法
//如果将代理放在订阅信号前设置,那么当控制器成为代理时是无法缓存这个代理对象实现了哪些代码方法的
//    _tbView.delegate = self;
//    _tbView.dataSource = self;
    
    [[self rac_signalForSelector:@selector(tableView:cellForRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"tableView:cellForRowAtIndexPath:");
    }];
    
    [[self rac_signalForSelector:@selector(tableView:numberOfRowsInSection:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"tableView:numberOfRowsInSection:");
    }];
    
    [[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"UITableViewDelegate:tableView:didSelectRowAtIndexPath:");
    }];
    
    [_tbView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"1"];

//  ✅
    _tbView.delegate = self;
    _tbView.dataSource = self;
}

7.RACSubject RACReplaySubject
RACSubject继承自RACSignal

  • 比起RACSignal,添加了一个可以主动发送信息的方法,要知道RACSignal是不能主动调用sendNext
    - (void)sendNext:(nullable ValueType)value;
    //创建信号 RACSubject
    RACSubject *subject = [RACSubject subject];
    //没订阅前直接发送信号
    [subject sendNext:@"subject 1"];
    //订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@" subject subscribeNext = %@", x);
    }];
    //发送信号
    [subject sendNext:@"subject"];
    
    //RACReplaySubject继承自RACSubject,区别是会订阅到曾经发送过的所有信号值
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    //没订阅前直接发送信号 在订阅后依然会收到
    [replaySubject sendNext:@"replaySubject"];
    
    [replaySubject subscribeNext:^(id  _Nullable x) {
        NSLog(@" replaySubject subscribeNext = %@", x);
    }];
    [replaySubject sendNext:@"replaySubject"];

还有其他用法后续会继续更新

相关文章

  • RAC Day3 RAC为UIKit提供的信号以及其他额外信号

    在 Day1[https://www.jianshu.com/p/bafabdcdc583] Day2[http...

  • 01-ReactiveObjC使用记录

    RAC 的核心思想:创建信号 - 订阅信号 - 发送信号 ,并且在 RAC 中我们会看到大量的 block RAC...

  • iOS ReactiveCocoa学习笔记(3):信号传递与数据

    本文知识点:RAC信号传递、RACSequence、RACTuple、利用RAC进行字典转模型。 1.RAC信号传...

  • ReactiveCocoa

    一、RAC的基本概念信号RACSignal: 信号是RAC中最核心的概念,贯穿在整个RAC框架中。它其实是一个信号...

  • RAC使用

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

  • RAC

    Rac -- 信号集

  • GO:0016601,Rac protein signal tr

    Rac protein signal transduction[Rac蛋白信号传导[http://amigo.ge...

  • rac 事件概述及处理

    概述:想要知道rac就必须知道rac中的三个要点 创建信号、发送信号、订阅信号。 reactive事件 reac...

  • RAC信号

    1、 信号量的合并CombineLatest 信号量的合并说白了就是把两个水管中的水合成一个水管中的水。但这个合并...

  • RAC学习笔记(一)

    Signal RAC的核心是signal,RAC世界所有的消息都是通过信号的方式传递的。 创建信号 它的内部实现是...

网友评论

    本文标题:RAC Day3 RAC为UIKit提供的信号以及其他额外信号

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