美文网首页
ReactiveCocoa笔记

ReactiveCocoa笔记

作者: 观星 | 来源:发表于2018-07-06 16:18 被阅读12次

    RAC

    参考文章

    任何的信号转换即是对原有的信号进行订阅从而产生新的信号

    kvo

    下面两种写法等价

    [[self.tableView rac_valuesForKeyPath:@"contentOffset" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@ %@",NSStringFromClass([x class]),x);
    }];
    
    
    [RACObserve(self.tableView, contentOffset) subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@ %@",NSStringFromClass([x class]),x);
    }];
    
    
    1. 为什么不需要移除监听?
    2. 为什么后面一种写法输入keypath会有提示?

    取消kvo监听(取消订阅)

    - (void)cancelKVO {
        RACSignal *signal = [self.tableView rac_valuesForKeyPath:@"contentOffset" observer:self];
        
        __block RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@ %@",NSStringFromClass([x class]),x);
            
            [disposable dispose];
        }];
    }
    

    delegate

    通过RAC实现协议方法

    [[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"xx %@",x);
    }];
        
    self.tableView.delegate = self;
    
    

    注意在最后设置一下代理,初步看,因该和运行时相关,具体还得仔细分析源码。

    [[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"xx %@",x);
    }];
    

    执行前后添加断点,输出isa

    (lldb) po self->isa
    DelegateVC
    
    (lldb) po self->isa
    DelegateVC_RACSelectorSignal
    

    可以看到类已经发生了变化。在这个过程中,新的类应该实现了代理方法.

    事件监听

    [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"button touch up inside");
    }];
    

    timer

    延迟调用

    [[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{
        NSLog(@"main thread after delay 2");
    }];
    

    定时触发

    // takeUntil设置了订阅的条件,否则timer不会停止
    [[[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"RAC timer ...");
    }];
    

    [测试Demo地址] (https://github.com/xxdzyyh/LearnRAC.git)

    相关文章

      网友评论

          本文标题:ReactiveCocoa笔记

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