RAC
參考文章
- 細(xì)說ReactiveCocoa的冷信號與熱信號(一)
- 細(xì)說ReactiveCocoa的冷信號與熱信號(二):為什么要區(qū)分冷熱信號
- 細(xì)說ReactiveCocoa的冷信號與熱信號(三):怎么處理冷信號與熱信號
任何的信號轉(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);
}];
- 為什么不需要移除監(jiān)聽?
- 為什么后面一種寫法輸入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)