map :映射
textField.rac_textSigal map:^id(NSString* value){
return @(value.length);
} subscribeNext:^(NSString* x){
NSLog(@“%@“,x);
}
打?。?/p>
0 ?1 ?2 ?3 ?4
filter : 過濾
textField.rac_textSigal filter:BOOL(NSString* value){
return value.length > 3;
}
delay: 延時
設(shè)置延時兩秒后發(fā)送消息
[[[RACSignal createSignal:^RACDisposable*(id subscriber){
[subscriber sendNext:@“ricke”];
[subscriber sendCompleted];
return nil;
}] delay:2]
subscribeNext:^(id x){
NSLog(@“%@”,x);
}];
startWith: 在發(fā)送消息之前,先發(fā)送一個消息
[[[RACSignal createSignal:^RACDisposable* (id subscriber){
[subscriber sendNext:@“next”];
[subscriber sendCompleted];
return nil;
}] startWith:@“RAC”]
subscriberNext:^(id x){
NSLog(@“%@”,x);
}];
timeout :超時
[[[RACSignalcreateSignal:^RACDisposable* (idsubscriber){
[[RACSchedulermainThreadScheduler]afterDelay:3schedule:^{
[subscribersendNext:@"sned"];
[subscribersendCompleted];
}];
returnnil;
}]timeout:2onScheduler:[RACSchedulermainThreadScheduler]]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
take :發(fā)送多個消息的時候,取最前面的幾條
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"1"];
[subscribersendNext:@"2"];
[subscribersendNext:@"3"];
[subscribersendNext:@"4"];
[subscribersendNext:@"5"];
[subscribersendCompleted];
returnnil;
}]take:2]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
takelast : 發(fā)送多條消息的時候,取最后面的幾條
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"1"];
[subscribersendNext:@"2"];
[subscribersendNext:@"3"];
[subscribersendNext:@"4"];
[subscribersendNext:@"5"];
[subscribersendNext:@"6"];
[subscribersendCompleted];
returnnil;
}]takeLast:3]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
takeUntil :RACSignal (發(fā)送在takeUntil后面的信號完成前的消息)
//RAC這個消息是2秒后完成,所以1、2這兩個消息是可以發(fā)送到,而3秒后3、4就不會發(fā)送
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"1"];
[subscribersendNext:@"2"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[subscribersendNext:@"3"];
[subscribersendNext:@"4"];
[subscribersendCompleted];
});
[subscribersendCompleted];
returnnil;
}]takeUntil:[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[subscribersendNext:@"RAC"];
[subscribersendCompleted];
});
returnnil;
}]]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
takeWhileBlock :但takeWhileBlock返回YES的時候發(fā)送消息
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"1"];
[subscribersendNext:@"2"];
[subscribersendNext:@"3"];
[subscribersendNext:@"4"];
[subscribersendNext:@"5"];
[subscribersendCompleted];
returnnil;
}]takeWhileBlock:^BOOL(idx) {
returnYES;
}]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
skip: 跳過
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"1"];
[subscribersendNext:@"2"];
[subscribersendNext:@"3"];
[subscribersendNext:@"4"];
[subscribersendNext:@"5"];
[subscribersendNext:@"6"];
[subscribersendCompleted];
returnnil;
}]skip:2]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
skipWhileBlock 和skipUntilBlock
skipWhileBlock :當block返回YES的時候跳過,返回NO的時候發(fā)送
skipUntilBlock:skipUntilBlock和skipWhileBlock相反,當block返回NO的時候跳,返回YES的時候發(fā)送
throttle (節(jié)流)優(yōu)化請求時間間隔
throttle: 設(shè)置一個間隔時間,當兩次信號之間的時間差小于這個時間就不會發(fā)送請求
[[textField.rac_textSignalthrottle:0.3]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
distinctUntilChanged: 優(yōu)化請求字符一樣的時候(當后一個請求和錢一個請求一樣的時候,就可以不用請求)
[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
ignore : 忽略某些 例如上面的空字符
[[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]ignore:@""]
subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
switchToLatest : 當你請求數(shù)據(jù)的時候、網(wǎng)絡(luò)會有延遲,數(shù)據(jù)還沒有返回回來,這時候你發(fā)送了新的請求,則我們?nèi)∠耙淮蔚恼埱?,只發(fā)送最新的請求
[[[[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]ignore:@""]
map:^id(idvalue) {
return[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"request"];
[subscribersendCompleted];
returnnil;
}];
}]switchToLatest]
subscribeNext:^(idx) {
NSLog(@"--request---%@",x);
}];
多個信號處理
merge :同時訂閱2個信號
RACSignal* signalA = [RACSignalcreateSignal:^RACDisposable*(id subscriber) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[subscribersendNext:@"SignalA"];
[subscribersendCompleted];
});
returnnil;
}];
RACSignal* signalB = [RACSignalcreateSignal:^RACDisposable*(id subscriber) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[subscribersendNext:@"signalB"];
[subscribersendCompleted];
});
returnnil;
}];
[[signalAmerge:signalB]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
concat
singleA 完成后才會訂閱signalB有點像串行隊列 A失敗了B就不會被訂閱
[[signalAconcat:signalB]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
zipWith 和 ?combineLatest: 每個信號都至少要發(fā)送一次才可以被訂閱
[[signalAzipWith:signalB]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
[[RACSignalcombineLatest:@[signalA,signalB]]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
RAC中的宏:
RAC(self.titleLabel,text) = [RACSignal interval:1onScheduler:[RACScheduler mainThreadScheduler]]map:^id(NSData* value) {
returnvalue.description;
}
屬性監(jiān)聽
RACObserve(self.menuButton, enabled)