源代碼地址 https://github.com/Liuchunqi3240/demo/tree/master/ReactiveCocoaTour
目錄
[self textFiledUse];
[self buttonUse];
[self skip];
[self distinctUntilChanged];
[self take];
[self takeLast];
[self takeUntil];
[self switchToLatest];
[self doNextAndDoComplete];
[self deliverOn];
[self subscribOn];
[self interval];
[self timeOut];
[self delay];
[self retry];
[self replay];
[self throttle];
[self sequence];
[self notificationUse];
[self KVO];
cocoapods 安裝
target 'ReactiveCocoaTour' do
pod 'ReactiveObjC'
end
代碼使用
import
#import "ReactiveObjC.h"
textfiled
//textfiled 用法
- (void)textFiledUse{
//直接檢測值的變化 壞處是 第一次無變化時也會回調
@weakify(self);
[self.textFiled.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
@strongify(self);
NSLog(@"textfiled text is %@ x is %@",self.textFiled.text,x);
}];
//增加一個過濾條件
[[self.textFiled.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return [value hasPrefix:@"x"];
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"x is %@",x);
}];
//過濾掉特殊字符串不進行調用
[[self.textFiled.rac_textSignal ignore:@"sunny"] subscribeNext:^(NSString *value) {
NSLog(@"`sunny` could never appear : %@", value);
}];
//可以有多個訂閱者 依次執行
RACSignal *signal = self.textFiled.rac_textSignal;
[signal subscribeNext:^(id x) {
NSLog(@"1111");
}];
[signal subscribeNext:^(id x) {
NSLog(@"2222");
}];
}
button target
- (void)buttonUse{
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"button click");
}];
}
skip
- (void)skip{
//跳過前面兩個 skip 填寫跳過的個數
RACSubject *subject = [RACSubject subject];
[[subject skip:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendNext:@1];
}
distinctUntilChanged
- (void)distinctUntilChanged{
//和上次一樣的信號 不會被訂閱
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@2]; // 不會被訂閱
}
take
- (void)take{
//只取前面幾個的信號 take:nsinter count
RACSubject *subject = [RACSubject subject];
[[subject take:2]subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
takeLast
- (void)takeLast{
//只取后面幾個的信號 takeLast:nsinter count
RACSubject *subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
takeUntil
- (void)takeUntil{
//執行到 until的那個信號發出 結束 這里指subject2 發出next 或者 complete
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
[[subject1 takeUntil:subject2] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject1 sendNext:@1];
[subject1 sendNext:@2];
// [subject2 sendNext:@1]; //和下面 complete 效果相同
[subject2 sendCompleted];
[subject1 sendNext:@3];
}
switchToLatest
- (void)switchToLatest{
//只獲取最新的信號發出的指令 前面的都釋放掉
RACSubject *signalOfSignals = [RACSubject subject];
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
// 獲取信號中信號最近發出信號,訂閱最近發出的信號。
// 注意switchToLatest:只能用于信號中的信號
[signalOfSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[signalOfSignals sendNext:signalA];
[signalOfSignals sendNext:signalB];
[signalA sendNext:@"signalA"];
[signalB sendNext:@"signalB"];
}
doNext doComplete
- (void)doNextAndDoComplete{
[[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"hi"];
[subscriber sendCompleted];
return nil;
}]doNext:^(id _Nullable x) {
//在執行 [subscriber sendNext:@"hi"];之前先執行
NSLog(@"do next");
}]doCompleted:^{
//在執行 [subscriber sendCompleted];之前先執行
NSLog(@"do complete");
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
deliverOn
//內容傳遞切換到制定線程中,副作用在原來線程中,把在創建信號時block中的代碼稱之為副作用
- (void)deliverOn{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"%@",[NSThread currentThread]);
[subscriber sendNext:@1];
[subscriber sendCompleted];
return nil;
}]
//交付給主線程
deliverOn:[RACScheduler mainThreadScheduler] ]
subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
NSLog(@"%@",[NSThread currentThread]);
}];
});
}
subscribeOn
//內容傳遞和副作用都會切換到制定線程中
- (void)subscribeOn{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"%@",[NSThread currentThread]);
[subscriber sendNext:@"123"];
[subscriber sendCompleted];
return nil;
}]
subscribeOn:[RACScheduler mainThreadScheduler]]
subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
NSLog(@"%@",[NSThread currentThread]);
}];
});
}
interval
- (void)interval{
//定時器
[[RACSignal interval:1.0f onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"%@",x);
}];
}
timeOut
- (void)timeOut{
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//無任何操作 等超時
// [subscriber sendNext:@"ddsa"];
// NSError *error = [[NSError alloc]initWithDomain:@"unknwn domain" code:600 userInfo:@{@"error":@"超時"}];
// [subscriber sendError:error];
// [subscriber sendCompleted];
return nil;
}] timeout:3 onScheduler:[RACScheduler mainThreadScheduler]]subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}error:^(NSError * _Nullable error) {
NSLog(@"%@",error);
}];
}
delay
- (void)delay{
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"send next");
[subscriber sendNext:@"delay msg"];
[subscriber sendCompleted];
return nil;
}] delay:2]
subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
- (void)retry{
//重試
//不執行error block 一直到 執行send next 結束
__block int i = 0;
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
if (i == 5) {
[subscriber sendNext:@"send next"];
}else{
[subscriber sendError:[NSError errorWithDomain:@"unknown domain" code:600 userInfo:@{@"msg":[NSString stringWithFormat:@"%d",i]}]];
}
i ++;
return nil;
}]
retry]
subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}error:^(NSError * _Nullable error) {
NSLog(@"%@",error);
}];
}
replay
- (void)replay{
//多個訂閱者 只執行一遍副作用 沒有replay 要重復執行副作用
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@1];
[subscriber sendNext:@2];
return nil;
}] replay];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
}
throttle
- (void)throttle{
//節流 間隔1s以后 訂閱者獲取最新信號發出的指令 在1S內 sendNext都不會進subscribeBlock中
RACSubject *subject = [RACSubject subject];
[[subject throttle:1] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendNext:@4];
}
sequence
- (void)sequence{
// 遍歷數組
NSArray *array = @[@"1",@"2",@"3",@"4",@"5",@"6"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
// 遍歷字典
NSDictionary *dict = @{@"name":@"張旭",@"age":@24};
[dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {
RACTupleUnpack(NSString *key,NSString *value) = x;
NSLog(@"%@ %@",key,value);
}];
}
notification obsever
- (void)notificationUse{
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:@"notificationName" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"notificaiton is %@",x);
}];
}
KVO
- (void)KVO{
UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 200, 200, 400)];
scrolView.contentSize = CGSizeMake(200, 800);
scrolView.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrolView];
[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {
NSLog(@"success");
}];
}