map -- 映射
創(chuàng)建一個(gè)訂閱者的映射并且返回?cái)?shù)據(jù)(例:將textField的字符串轉(zhuǎn)為其本身長(zhǎng)度)
[[self.textField.rac_textSignal map:^id(NSString *value) {
NSLog(@"%@", value);
return value.length;
}] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
flattenmap -- 扁平映射(信號(hào)中的信號(hào))
實(shí)際上是根據(jù)前一個(gè)信號(hào)傳遞進(jìn)來(lái)的參數(shù)重新建立了一個(gè)信號(hào)虎敦,這個(gè)參數(shù)肿仑,可能會(huì)在創(chuàng)建信號(hào)的時(shí)候用到奕枝,也有可能根本用不到
- (RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id subscriber){
[self.signInService
signInWithUsername:self.usernameTextField.text
password:self.passwordTextField.text
complete:^(BOOL success){
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}];
return nil;
}];
}
[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
map:^id(id x){
return [self signInSignal];
}]
subscribeNext:^(id x){
NSLog(@"Sign in result: %@", x);
}];
此時(shí)當(dāng)我們使用map映射的是一個(gè)信號(hào)(即信號(hào)中的信號(hào))匠题,映射出來(lái)的value是(RACSignal *)期犬,這時(shí)我們subscribeNext的value即為此信號(hào)類(lèi)型溺忧,而不是信號(hào)中的value值微渠;所以這里調(diào)用flattenMap霎苗,創(chuàng)建新的信號(hào)争剿,使用(RACSignal *)的value作為新信號(hào)的value已艰,也就是我們需要的值。
補(bǔ)充
map 與 swtichToLatest結(jié)合類(lèi)似于flattenMap
switchToLatest:選擇最新的信號(hào)的value蚕苇,比如我依次發(fā)送3個(gè)signal哩掺,但是switchToLatest只取第三個(gè)響應(yīng)信號(hào)的value。
filter -- 過(guò)濾
信號(hào)變化時(shí)篩選出需要的信號(hào)(例:當(dāng)textField的字符串長(zhǎng)度大于3時(shí)涩笤,信號(hào)才會(huì)響應(yīng))
[[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
return value.length > 3;
}] subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
take/skip/repeat -- 獲取/跳過(guò)/重復(fù)
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"1"];
[subscriber sendNext:@"2"];
[subscriber sendNext:@"3"];
[subscriber sendNext:@"4"];
[subscriber sendNext:@"5"];
[subscriber sendCompleted];
return nil;
}] take:2];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}completed:^{
NSLog(@"completed");
}];
這個(gè)signal只會(huì)輸出前兩個(gè)信號(hào)1和2還有完成信號(hào)completed疮丛,skip
repeat
同理。
相似的還有takeLast
takeUntil
takeWhileBlock
skipWhileBlock
skipUntilBlock
repeatWhileBlock
都可以根據(jù)字面意思來(lái)理解辆它。
distinctUntilChanged
網(wǎng)絡(luò)請(qǐng)求中為了減輕服務(wù)器壓力誊薄,無(wú)用的請(qǐng)求我們應(yīng)該盡可能不發(fā)送。distinctUntilChanged的作用是使RAC不會(huì)連續(xù)發(fā)送兩次相同的信號(hào)锰茉,這樣就解決了這個(gè)問(wèn)題呢蔫。
[[[self.textField rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
ignore -- 忽略
指定一個(gè)任意類(lèi)型的量(可以是字符串,數(shù)組等)飒筑,當(dāng)需要發(fā)送信號(hào)時(shí)講進(jìn)行判斷片吊,若相同則該信號(hào)會(huì)被忽略發(fā)送。
[[[self.textFild rac_textSignal] ignore:@"good"] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
delay -- 延時(shí)
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"delay"];
[subscriber sendCompleted];
return nil;
}] delay:2];
NSLog(@"tag");
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
throttle --節(jié)流
在我們做搜索框的時(shí)候协屡,有時(shí)候需求的時(shí)實(shí)時(shí)搜索俏脊,即用戶(hù)每每輸入字符,view都要求展現(xiàn)搜索結(jié)果肤晓。這時(shí)如果用戶(hù)搜索的字符串較長(zhǎng)爷贫,那么由于網(wǎng)絡(luò)請(qǐng)求的延時(shí)可能造成UI顯示錯(cuò)誤认然,并且多次不必要的請(qǐng)求還會(huì)加大服務(wù)器的壓力,這顯然是不合理的漫萄,此時(shí)我們就需要用到節(jié)流卷员。
[[[self.textFild rac_textSignal] throttle:0.5] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
加了節(jié)流管道,后面跟上了類(lèi)型為NSTimeInterval的參數(shù)后腾务,只有0.5S內(nèi)信號(hào)不產(chǎn)生變化才會(huì)發(fā)送請(qǐng)求毕骡,這樣快速的輸入也不會(huì)造成多次輸出。
timeout -- 超時(shí)信號(hào)
當(dāng)超出限定時(shí)間后會(huì)給訂閱者發(fā)送error信號(hào)岩瘦。
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{
[subscriber sendNext:@"delay"];
[subscriber sendCompleted];
}];
return nil;
}] timeout:2 onScheduler:[RACScheduler mainThreadScheduler]];
[signal subscribeNext:^(id x) {
NSLog(@"%@", x);
} error:^(NSError *error) {
NSLog(@"%@", error);
}];
由于在創(chuàng)建信號(hào)是限定了延遲3秒發(fā)送未巫,但是加了timeout2秒的限定,所以這一定是一個(gè)超時(shí)信號(hào)启昧。這個(gè)信號(hào)被訂閱后橱赠,由于超時(shí),不會(huì)執(zhí)行訂閱成功的輸出x方法箫津,而是跳到error的塊輸出了錯(cuò)誤信息狭姨。timeout在用RAC封裝網(wǎng)絡(luò)請(qǐng)求時(shí)可以節(jié)省不少的代碼量。