ReactiveCocoa笔记

2018-07-06  本文已影响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)

上一篇下一篇

猜你喜欢

热点阅读