1矾利、ReactiveCocoa開(kāi)發(fā)中常見(jiàn)用法
-
代替代理:
rac_signalForSelector:用于替代代理。
-
代替KVO :
rac_valuesAndChangesForKeyPath:用于監(jiān)聽(tīng)某個(gè)對(duì)象的屬性改變。
-
監(jiān)聽(tīng)事件:
rac_signalForControlEvents:用于監(jiān)聽(tīng)某個(gè)事件。
-
代替通知:
rac_addObserverForName:用于監(jiān)聽(tīng)某個(gè)通知。
-
監(jiān)聽(tīng)文本框文字改變:
rac_textSignal:只要文本框發(fā)出改變就會(huì)發(fā)出這個(gè)信號(hào)槐壳。
2、ReactiveCocoa高級(jí)用法
-
Map
Map作用:把源信號(hào)的值映射成一個(gè)新的值
###### Map使用步驟:
1.傳入一個(gè)block,類型是返回對(duì)象喜每,參數(shù)是value
2.value就是源信號(hào)的內(nèi)容务唐,直接拿到源信號(hào)的內(nèi)容做處理
3.把處理好的內(nèi)容,直接返回就好了灼卢,不用包裝成信號(hào)绍哎,返回的值,就是映射的值鞋真。
Map使用場(chǎng)景:
1.服務(wù)端返回的數(shù)據(jù)不是你需要的崇堰,需要進(jìn)行一次二次加工,使用 map就會(huì)很方便
[[_textField.rac_textSignal map:^id(id value) {
// 當(dāng)源信號(hào)發(fā)出,就會(huì)調(diào)用這個(gè)block海诲,修改源信號(hào)的內(nèi)容
// 返回值:就是處理完源信號(hào)的內(nèi)容繁莹。
return [NSString stringWithFormat:@"輸出:%@",value];
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
-
concat
concat:按一定順序拼接信號(hào),當(dāng)多個(gè)信號(hào)發(fā)出的時(shí)候特幔,有順序的接收信號(hào)咨演。
concat使用場(chǎng)景:
1.在工作中,有這樣的需求蚯斯,可能一個(gè)頁(yè)面要發(fā)送幾個(gè)API薄风,要求有一個(gè)API是依賴其他幾個(gè)API,等到所有API都成功之后在刷新UI
RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@1];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@2];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"3"];
[subscriber sendCompleted];
return nil;
}];
//信號(hào)3依賴信號(hào)1和信號(hào)2
RACSignal *signal = [[[RACSignal merge:@[signal1,signal2]]concat:signal3] filter:^BOOL(id value) {
return [value isKindOfClass:[NSNumber class]];
}];
[signal subscribeNext:^(id x) {
NSLog(@"====%@",x);
}completed:^{
NSLog(@"所有都完事了");
}];
log
2017-03-07 17:25:35.339 racDemo[61024:1544009] ====1
2017-03-07 17:25:35.340 racDemo[61024:1544009] ====2
2017-03-07 17:25:35.341 racDemo[61024:1544009] 所有都完事了
記得加 [subscriber sendCompleted];
-
Zip
zip:把兩個(gè)信號(hào)壓縮成一個(gè)信號(hào)拍嵌,只有當(dāng)兩個(gè)信號(hào)同時(shí)發(fā)出信號(hào)內(nèi)容時(shí)遭赂,并且把兩個(gè)信號(hào)的內(nèi)容合并成一個(gè)元組,才會(huì)觸發(fā)壓縮流的next事件横辆。
RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@1];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@2];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"3"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal = [RACSignal zip:@[signal1,signal2,signal3] reduce:^id(NSNumber *s1,NSNumber *s2,NSString *s3){
return RACTuplePack(s1,s2,s3);
}];
[signal subscribeNext:^(RACTuple *tuple) {
RACTupleUnpack(NSNumber *num1,NSNumber *num2,NSString *s3) = tuple;
NSLog(@"%@%@%@",num1,num2,s3);
}completed:^{
NSLog(@"所有都完事了");
}];
log
2017-03-07 17:38:57.227 racDemo[61197:1553408] 123
2017-03-07 17:38:57.227 racDemo[61197:1553408] 所有都完事了
tips:
1撇他,記住要發(fā)送 [subscriber sendCompleted];
2,順序不要亂了狈蚤,每一個(gè)信號(hào)對(duì)應(yīng)一個(gè)返回困肩,順序錯(cuò)了,返回的值也就不對(duì)應(yīng)了
3脆侮,sendNext只會(huì)走一次锌畸,如果有兩個(gè)sendNext,那么第二個(gè)發(fā)過(guò)來(lái)的值就不會(huì)生效
4,如果只要一個(gè)值靖避,就沒(méi)有必要RACTuplePack了
eg:
[subscriber sendNext:@"3"];
[subscriber sendNext:@"100"];
[subscriber sendCompleted];
同樣代碼蹋绽,在后面多加上一個(gè)sendNext 輸出結(jié)果如下
2017-03-07 17:44:17.808 racDemo[61350:1558976] 123
2017-03-07 17:44:17.808 racDemo[61350:1558976] 所有都完事了
-
combineLatest:
combineLatest將多個(gè)信號(hào)合并起來(lái),并且拿到各個(gè)信號(hào)的最新的值,必須每個(gè)合并的signal至少都有過(guò)一次sendNext筋蓖,才會(huì)觸發(fā)合并的信號(hào)。
RACSignal combineLatest:<#(id<NSFastEnumeration>)#> reduce:<#^id(void)reduceBlock#>
RACSignal combineLatest:<#(id<NSFastEnumeration>)#>
用法和zip reduce差不多退敦,但是每次有最新的都會(huì)回調(diào)
-
filter:
// 過(guò)濾:
// 每次信號(hào)發(fā)出粘咖,會(huì)先執(zhí)行過(guò)濾條件判斷.
[_textField.rac_textSignal filter:^BOOL(NSString *value) {
return value.length > 3;
}];
-
doNext && doCompleted
[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@1];
[subscriber sendCompleted];
return nil;
}] doNext:^(id x) {
// 執(zhí)行[subscriber sendNext:@1];之前會(huì)調(diào)用這個(gè)Block
NSLog(@"doNext");;
}] doCompleted:^{
// 執(zhí)行[subscriber sendCompleted];之前會(huì)調(diào)用這個(gè)Block
NSLog(@"doCompleted");;
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
-
interval
[[RACSignal interval:1 onScheduler:[RACScheduler currentScheduler]] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
-
then
then:用于連接兩個(gè)信號(hào),當(dāng)?shù)谝粋€(gè)信號(hào)完成侈百,才會(huì)連接then返回的信號(hào)瓮下。
// then:用于連接兩個(gè)信號(hào),當(dāng)?shù)谝粋€(gè)信號(hào)完成钝域,才會(huì)連接then返回的信號(hào)
// 注意使用then讽坏,之前信號(hào)的值會(huì)被忽略掉.
// 底層實(shí)現(xiàn):1、先過(guò)濾掉之前的信號(hào)發(fā)出的值例证。2.使用concat連接then返回的信號(hào)
[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@1];
[subscriber sendCompleted];
return nil;
}] then:^RACSignal *{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@2];
return nil;
}];
}] subscribeNext:^(id x) {
// 只能接收到第二個(gè)信號(hào)的值路呜,也就是then返回信號(hào)的值
NSLog(@"%@",x);
}];