一.RAC基礎(chǔ)使用
監(jiān)聽方法調(diào)用
[[self rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(id _Nullable x) {
NSLog(@"按鈕點擊");
}];
[[self rac_signalForSelector:@selector(innerFunc)] subscribeNext:^(id _Nullable x) {
NSLog(@"innerFunc");
}];
for (int i=0; i<5; i++) {
[self innerFunc];
}
[[self rac_signalForSelector:@selector(viewDidAppear:)]subscribeNext:^(id _Nullable x) {
NSLog(@"viewDidAppear:%@",x);
}];
KVO
//方式1
[[self.view rac_valuesForKeyPath:@"backgroundColor" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"backgroundColor1:%@",x);
}];
self.view.backgroundColor=[UIColor orangeColor];
//方式2
[RACObserve(self.view,backgroundColor)subscribeNext:^(id _Nullable x) {
NSLog(@"backgroundColor2:%@",x);
}];
self.view.backgroundColor=[UIColor whiteColor];
通知
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardDidShowNotification object:self]subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"監(jiān)聽鍵盤彈出通知x:%@",x);
}];
監(jiān)聽View事件
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"監(jiān)聽Button點擊:x:%@",x);
}];
[[self.textfield rac_textSignal]subscribeNext:^(NSString * _Nullable x) {
NSLog(@"監(jiān)聽TextField輸入變化:x:%@",x);
}];
監(jiān)聽Timer
__block int i=0;
racdis =[[RACSignal interval:1.0 onScheduler:[RACScheduler scheduler]]subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"rac_tiemr:%@",x);
i++;
if(i==5)
{
[racdis dispose];
}
}];
RACSignal
RACSignal可以作為消息訂閱者伤柄,但是自身不能發(fā)送消息。
RACSignal * signal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"signal"];
[subscriber sendCompleted];
return nil;
}];
[signal subscribeNext:^(id x) {
SDLog(@"signal_x:%@",x);
}];
RACSubject
RACSubject是RACSignal的子類
RACSignal可以作為消息訂閱者营勤,同時也可以發(fā)送消息章母。
RACSubject * subject=[RACSubject subject];
[subject subscribeNext:^(id x) {
SDLog(@"subject_x:%@",x);
}];
[subject sendNext:@"subject"];
RACCommand
//1.創(chuàng)建信號
RACCommand * command=[[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"command"];
[subscriber sendCompleted];
return nil;
}];
}];
//2.訂閱信號
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
SDLog(@"command_x:%@",x);
}];
//3.執(zhí)行信號
[command execute:nil];
二.RAC高級使用
distinctUntilChanged:
當(dāng)上一次的值和當(dāng)前的值有明顯的變化就會發(fā)出信號雾袱,否則會被忽略掉。
在開發(fā)中刹淌,刷新UI經(jīng)常使用饶氏,只有兩次數(shù)據(jù)不一樣才需要刷新
RACSubject * subject=[RACSubject subject];
[subject subscribeNext:^(id x) {
SDLog(@"x=%@",x);//打印x=1 x=2 x=3 x=3 x=3
}];
// [[subject distinctUntilChanged] subscribeNext:^(id x) {
// SDLog(@"x=%@",x);//打印x=1 x=2 x=3
// }];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendNext:@"3"];
[subject sendNext:@"3"];
take:
從開始一共取N次的信號
RACSubject * subject=[RACSubject subject];
//take:取前面幾個值
//在沒遇到[subject sendCompleted];那么就會停止發(fā)送信號
[[subject take:2]subscribeNext:^(id x) {
SDLog(@"take %@",x);//打印1 2
}];
//takeLast:取后面多少個值,必須發(fā)送完成
//只有[subject sendCompleted];才會發(fā)送信號
[[subject takeLast:2]subscribeNext:^(id x) {
SDLog(@"takeLast %@",x);//打印4 5
}];
//takeUntil:只要傳入的信號發(fā)送完成或者self.rac_willDeallocSignal發(fā)送信號,就不會再接收信號的內(nèi)容
[[subject takeUntil:self.rac_willDeallocSignal]subscribeNext:^(id x) {
SDLog(@"takeUntil %@",x);//打印1 2 3 4 5
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendNext:@"4"];
[subject sendNext:@"5"];
[subject sendCompleted];
skip:
跳過前幾個信號再開始接受信號
RACSubject * subject=[RACSubject subject];
[[subject skip:3]subscribeNext:^(id x) {
SDLog(@"%@",x);//打印4 5
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendNext:@"4"];
[subject sendNext:@"5"];
[subject sendCompleted];
switchToLatest:
用于signalOfSignals(信號的信號),有時候信號也會發(fā)出信號有勾,會在signalOfSignals中嚷往,獲取signalOfSignals發(fā)送的最新信號
RACSubject * subject=[RACSubject subject];
RACSubject * subject_sub1=[RACSubject subject];
[subject.switchToLatest subscribeNext:^(id x) {
SDLog(@"%@",x);//打印1 2
}];
[subject sendNext:subject_sub1];
[subject_sub1 sendNext:@"1"];
[subject_sub1 sendNext:@"2"];