ReactiveCocoa操作方法之映射(flattenMap,Map)
flattenMap,Map用于把源信號內(nèi)容映射成新的內(nèi)容。
map簡單使用:
RACSubject *subject = [RACSubject subject];
RACSignal *bindSignal = [subject map:^id(id value) {
return [NSString stringWithFormat:@"SWL:%@",value];
}];
[bindSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"111"];
flattenMap簡單使用:
RACSubject *signalOfSignal = [RACSubject subject];
RACSubject *signal = [RACSubject subject];
//方式一
// [signalOfSignal subscribeNext:^(RACSignal *x) {
// [x subscribeNext:^(id x) {
// NSLog(@"%@",x);
// }];
// }];
//方式二
// [[signalOfSignal switchToLatest]subscribeNext:^(id x) {
// NSLog(@"%@",x);
// }];
//方式三
[[signalOfSignal flattenMap:^RACStream *(id value) {
return value;
}]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[signalOfSignal sendNext:signal];
[signal sendNext:@"111"];
signalOfsignals用FlatternMap
FlatternMap和Map的區(qū)別
1.FlatternMap中的Block返回信號。
2.Map中的Block返回對象。
3.開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map
4.開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap。
ReactiveCocoa操作方法之組合
concat:按一定順序拼接信號,當(dāng)多個信號發(fā)出的時候,有順序的接收信號
- (void)viewDidLoad {
[super viewDidLoad];
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//偽代碼:發(fā)送頂部請求
[subscriber sendNext:@"頂部數(shù)據(jù)"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//偽代碼:發(fā)送底部請求
[subscriber sendNext:@"底部數(shù)據(jù)"];
return nil;
}];
//創(chuàng)建組合信號 關(guān)鍵字concat:按順序去連接
//注意:第一個信號一定要調(diào)用sendCompleted
RACSignal *concatSignal = [signalA concat:signalB];
//訂閱組合信號
[concatSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
then:用于連接兩個信號,當(dāng)?shù)谝粋€信號完成,才會連接then返回的信號。(會忽略第一個信號的所有值)
- (void)viewDidLoad {
[super viewDidLoad];
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//偽代碼:發(fā)送頂部請求
[subscriber sendNext:@"頂部數(shù)據(jù)"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//偽代碼:發(fā)送底部請求
[subscriber sendNext:@"底部數(shù)據(jù)"];
return nil;
}];
//創(chuàng)建組合信號
//then:忽略掉第一個信號所有值
RACSignal *thenSignal = [signalA then:^RACSignal *{
//返回信號就是需要組合的信號
return signalB;
}];
//訂閱信號
[thenSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
merge:把多個信號合并為一個信號,任何一個信號有新值的時候就會調(diào)用
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
//創(chuàng)建組合信號
RACSignal *mergeSignal = [signalA merge:signalB];
//訂閱組合信號
[mergeSignal subscribeNext:^(id x) {
//任意一個信號發(fā)送內(nèi)容都會來這個block
NSLog(@"%@",x);
}];
//發(fā)送
[signalA sendNext:@"111"];
[signalB sendNext:@"222"];
}
zipWith:把兩個信號壓縮成一個信號,只有當(dāng)兩個信號同時發(fā)出信號內(nèi)容時,并且把兩個信號的內(nèi)容合并成一個元組,才會觸發(fā)壓縮流的next事件。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
//壓縮成一個信號
//zipWith:當(dāng)一個界面多個請求的時候,要等所有請求完成才能更新ui
RACSignal *zipSignal = [signalA zipWith:signalB];
[zipSignal subscribeNext:^(id x) {
//zipWith:等所有信號都發(fā)送內(nèi)容的時候才調(diào)用
NSLog(@"%@",x);
}];
[signalB sendNext:@"2"];
[signalA sendNext:@"1"];
//打印結(jié)果:
//<RACTuple: 0x6000000077c0> (
//1,
//2
//)
}
combineLatest reduce先組合在聚合:
- (void)viewDidLoad {
//需求:登陸賬號和密碼都有值,登陸按鈕可點
[super viewDidLoad];
//先組合 在聚合
//combineLatest:組合哪些信號 reduce:聚合
RACSignal *combineSignal = [RACSignal combineLatest:@[[_accountField rac_textSignal],[_passwordField rac_textSignal]] reduce:^id(NSString *account,NSString *password){//block的參數(shù)和組合的信號一一對應(yīng)
//聚合的值就是組合信號的內(nèi)容
//block調(diào)用時刻:只要源信號發(fā)送內(nèi)容就回調(diào)用
return @(account.length && password.length);
}];
// [combineSignal subscribeNext:^(id x) {
// _loginButton.enabled = [x boolValue];
// }];
RAC(_loginButton,enabled) = combineSignal;
}
ReactiveCocoa操作方法之過濾
filter:過濾信號,使用它可以獲取滿足條件的信號.
- (void)viewDidLoad {
[super viewDidLoad];
//只有當(dāng)文本框內(nèi)容長度大于5,才獲取文本框的內(nèi)容
[[[_accountField rac_textSignal]filter:^BOOL(id value) {
//value:源信號的內(nèi)容
//返回值:就是過濾條件,只有滿足這個條件,才能獲取到內(nèi)容
return [value length] > 5;
}]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
ignore:忽略完某些值的信號.
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
RACSignal *ignoreSignal = [subject ignore:@"1"];
//ignoreValues:忽略所有值
// RACSignal *ignoreSignal = [subject ignoreValues];
[ignoreSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印結(jié)果:2
}
take:從開始一共取N次的信號
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject take:1]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印結(jié)果:1
}
takeLast:取最后N次的信號,前提條件,訂閱者必須調(diào)用完成,因為只有完成,就知道總共有多少信號.
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
//takeLast:取后面多少個值,必須要發(fā)送完成
[[subject takeLast:2]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendCompleted];
//打印結(jié)果:2 3
}
takeUntil:只要傳入信號發(fā)送完成或者發(fā)送任意數(shù)據(jù),就不會在接受源信號的內(nèi)容
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
RACSubject *signal = [RACSubject subject];
[[subject takeUntil:signal]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[signal sendCompleted];
//[signal sendNext:@"a"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
//打印結(jié)果:1
}
distinctUntilChanged:當(dāng)上一次的值和當(dāng)前的值有明顯的變化就會發(fā)出信號,否則會被忽略掉。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
//打印結(jié)果:1 2
}
skip:(NSUInteger):跳過幾個信號,不接受。
- (void)viewDidLoad {
[super viewDidLoad];
RACSubject *subject = [RACSubject subject];
[[subject skip:2]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
//打印結(jié)果:3
}