RAC常用方法總結(jié)

self.usernameTextField.rac_textSignal ?輸入框文本變化信號

[[[self.usernameTextField.rac_textSignal

? map:^id(NSString *text) {//map改變了事件傳遞的數(shù)據(jù)????

? ? return @(text.length);

? }] filter:^BOOL(NSNumber *length) {//信號通過條件

? ? return [length integerValue] > 3;

?}] subscribeNext:^(id x) {

?? ?NSLog(@"%@", x); ?}];

RAC宏允許直接把信號的輸出應(yīng)用到對象的屬性上。RAC宏有兩個參數(shù),第一個是需要設(shè)置屬性值的對象,第二個是屬性名。每次信號產(chǎn)生一個next事件,傳遞過來的值都會應(yīng)用到該屬性上,如下:

RAC(self.passwordTextField, backgroundColor) =[validPasswordSignal map:^id(NSNumber *passwordValid) {

? ? ? return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor]; ? ?}];

聚合信號;RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal] ? ? ? ?????????????????????????reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid) { return @([usernameValid boolValue] && [passwordValid boolValue]);}];

用于監(jiān)聽某個事件:[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

NSLog(@"button clicked"); }];

RACObserve(self, name):監(jiān)聽某個對象的某個屬性,返回的是信號。

[RACObserve(self.view, center) subscribeNext:^(id x) {

?????NSLog(@"%@",x);

?}];


?// 把監(jiān)聽到的通知轉(zhuǎn)換信號

? [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {

? ? ? ? NSLog(@"鍵盤彈出");

? ];

創(chuàng)建信號:

-(RACSignal *)signInSignal {

? return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> 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]

doNext:^(id x) {//附加操作,并不改變事件本身

? ? self.signInButton.enabled = NO;

? ? self.signInFailureText.hidden = YES;

? }]?flattenMap:^id(id x) {//把按鈕點擊事件轉(zhuǎn)換為登錄信號,同時還從內(nèi)部信號發(fā)送事件到外部信號

? ? ???????? return [self signInSignal];

? ? ? ? ?}] subscribeNext:^(id x) {

? ? ???????? NSLog(@"Sign in result: %@", x);

? ???? }];

1: RACSiganl(信號類)只是表示當(dāng)數(shù)據(jù)改變時,信號內(nèi)部會發(fā)出數(shù)據(jù),它本身不具備發(fā)送信號的能力,而是交給內(nèi)部一個訂閱者subscriber去發(fā)出。2:默認(rèn)一個信號都是冷信號,就算是值改變了,但你沒有訂閱這個信號的話它也不會觸發(fā)的,只有訂閱了這個信號,這個信號才會變?yōu)闊嵝盘?,值改變了才會觸發(fā)

RACSubject(信號提供者)它自己可以充當(dāng)信號,又能發(fā)送信號(用來代替代理)

RACSequence RAC中的集合類,可用來快速遍歷數(shù)組,字典!RACTuple RAC中的元組類,類似NSArray,用來包裝值。

?RACSequence的簡單使用:

// 遍歷字典,遍歷出來的鍵值對會包裝成RACTuple(元組對象

? NSDictionary *dict = @{@"name":@"張旭",@"age":@24};

? [dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {

? ? ? // RACTuple 就是一個元組,元組的概念在Swift有專門的介紹,沒掌握的可以自己上網(wǎng)查一下!

? ? ? NSLog(@"RACTuple = %@",x);

? ? ? // 解包元組,會把元組的值,按順序給參數(shù)里面的變量賦值

? ? ? RACTupleUnpack(NSString *key,NSString *value) = x;

? ? ? ?NSLog(@"%@ %@",key,value);

? ?}];

字典轉(zhuǎn)模型RAC高級寫法:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];

?NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];

?// map:映射的意思,目的:把原始值value映射成一個新值

?// array: 把集合轉(zhuǎn)換成數(shù)組

?// 底層實現(xiàn):當(dāng)信號被訂閱,會遍歷集合中的原始值,映射成新值,并且保存到新的數(shù)組里。

NSArray *flags = [[dictArr.rac_sequence map:^id(id value) {

?return [FlagItem flagWithDict:value];

?}] array];

RACCommand:

RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞,包裝到這個類中,他可以很方便的監(jiān)控事件的執(zhí)行過程。

使用場景:監(jiān)聽按鈕點擊,網(wǎng)絡(luò)請求

// 1.創(chuàng)建命令

? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

????????????NSLog(@"執(zhí)行命令");

????????????// 創(chuàng)建空信號,必須返回信號

? ? ? ? ????// ?return [RACSignal empty];

????????// 2.創(chuàng)建信號,用來傳遞數(shù)據(jù)

? ? ? ? return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

?????????????????????[subscriber sendNext:@"請求數(shù)據(jù)"];

????????????????????????// 注意:數(shù)據(jù)傳遞完,最好調(diào)用sendCompleted,這時命令才執(zhí)行完畢。

? ? ? ? ????????????????? [subscriber sendCompleted];

?????????????????????????return nil;

?}];

}];

// 強(qiáng)引用命令,不要被銷毀,否則接收不到數(shù)據(jù)

?_conmmand = command;

// 3.訂閱RACCommand中的信號

?[command.executionSignals subscribeNext:^(id x) {

?[x subscribeNext:^(id x) {

?NSLog(@"%@",x);

}];

}];

?// RAC高級用法

? // switchToLatest:用于signal of signals,獲取signal of signals發(fā)出的最新信號,也就是可以直接拿到RACCommand中的信號

? [command.executionSignals.switchToLatest subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

// 4.監(jiān)聽命令是否執(zhí)行完畢,默認(rèn)會來一次,可以直接跳過,skip表示跳過第一次信號,take表示接收2次信號

[[[command.executing skip:1] take:2]?subscribeNext:^(id x) {

?if ([x boolValue] == YES) {

? ? ? ? ? ? // 正在執(zhí)行

? ? ? ? ? ? NSLog(@"正在執(zhí)行");

?}else{ // 執(zhí)行完成

? NSLog(@"執(zhí)行完成");

}

}];

? // 5.執(zhí)行命令

?[self.conmmand execute:@1];

RACMulticastConnection:用于當(dāng)一個信號,被多次訂閱時,為了保證創(chuàng)建信號時,避免多次調(diào)用創(chuàng)建信號中的block,造成副作用,可以使用這個類處理。

// RACMulticastConnection:解決重復(fù)請求問題

// 1.創(chuàng)建信號

?RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

?????????NSLog(@"發(fā)送請求");

? ? ? ? [subscriber sendNext:@1];

?????????return nil; }];

?// 2.創(chuàng)建連接

? ? RACMulticastConnection *connect = [signal publish];

?// 3.訂閱信號,

?// 注意:訂閱信號,也不能激活信號,只是保存訂閱者到數(shù)組,必須通過連接,當(dāng)調(diào)用連接,就會一次性調(diào)用所有訂閱者的sendNext:

?[connect.signal subscribeNext:^(id x) {

????????NSLog(@"訂閱者一信號");

}];

[connect.signal subscribeNext:^(id x) {

????NSLog(@"訂閱者二信號");

}];

// 4.連接,激活信號

?[connect connect];

rac_liftSelector:withSignalsFromArray:Signals:處理多個請求,都返回結(jié)果的時候,統(tǒng)一做處理.

? ? RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

?// 發(fā)送請求1

? ? ? ? [subscriber sendNext:@"發(fā)送請求1"];

? ? ? ? return nil;

? ? }];

RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

? ? ? ? // 發(fā)送請求2

?[subscriber sendNext:@"發(fā)送請求2"];

return nil;

? ? }];

// 使用注意:幾個信號,參數(shù)一的方法就幾個參數(shù),每個參數(shù)對應(yīng)信號發(fā)出的數(shù)據(jù)。

[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];


- (RACSignal *)then:(RACSignal * (^)(void))block; 這個方法功能是忽略接收者所有的next,直到信號complete返回一個新的RACSignal,當(dāng)[self rac_signalForSelector:@selector(dismiss:)]信號sendComplete的時候,執(zhí)行一個block,這個block必須返回一個不為空的新的RACSignal

[[self rac_signalForSelector:@selector(dismiss:)] then:^RACSignal *{

? ? ? ? @strongify(self);

? ? ? ? return [RACSignal return:self.array];

? ? }];

或者:[[self rac_signalForSelector:@selector(dismiss:)] map:^id(id value) {

? ? ? ? @strongify(self);

? ? ? ? return self.array;

? ? }];

對于需要監(jiān)聽協(xié)議方法的時候可以使用 - (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容