ReactiveCocoa筆記

RAC

參考文章

任何的信號轉(zhuǎn)換即是對原有的信號進(jìn)行訂閱從而產(chǎn)生新的信號

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. 為什么不需要移除監(jiān)聽?
  2. 為什么后面一種寫法輸入keypath會有提示?

取消kvo監(jiān)聽(取消訂閱)

- (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實現(xiàn)協(xié)議方法

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

注意在最后設(shè)置一下代理,初步看,因該和運行時相關(guān),具體還得仔細(xì)分析源碼。

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

執(zhí)行前后添加斷點,輸出isa

(lldb) po self->isa
DelegateVC

(lldb) po self->isa
DelegateVC_RACSelectorSignal

可以看到類已經(jīng)發(fā)生了變化。在這個過程中,新的類應(yīng)該實現(xiàn)了代理方法.

事件監(jiān)聽

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

timer

延遲調(diào)用

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

定時觸發(fā)

// takeUntil設(shè)置了訂閱的條件,否則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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容