@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *accountField;
@property (weak, nonatomic) IBOutlet UITextField *pwdField;
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self concat];
}
// 把多個(gè)信號(hào)聚合成你想要的信號(hào),使用場景----:比如-當(dāng)多個(gè)輸入框都有值的時(shí)候按鈕才可點(diǎn)擊。
// 思路--- 就是把輸入框輸入值的信號(hào)都聚合成按鈕是否能點(diǎn)擊的信號(hào)。
- (void)combineLatest {
RACSignal *combinSignal = [RACSignal combineLatest:@[self.accountField.rac_textSignal, self.pwdField.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ //reduce里的參數(shù)一定要和combineLatest數(shù)組里的一一對(duì)應(yīng)。
// block: 只要源信號(hào)發(fā)送內(nèi)容,就會(huì)調(diào)用,組合成一個(gè)新值。
NSLog(@"%@ %@", account, pwd);
return @(account.length && pwd.length);
}];
// // 訂閱信號(hào)
// [combinSignal subscribeNext:^(id x) {
// self.loginBtn.enabled = [x boolValue];
// }]; // ----這樣寫有些麻煩,可以直接用RAC宏
RAC(self.loginBtn, enabled) = combinSignal;
/*
RACSignal *signal = [RACSignal combineLatest:@[self.accountField.rac_textSignal,self.pwdField.rac_textSignal] reduce:^id(NSString *string1, NSString *string2){
return @(string1.length && string2.length) ;
}];
RAC(self.loginBtn,selected) = signal ;
*/
}
- (void)zipWith {
//zipWith:把兩個(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事件。
// 創(chuàng)建信號(hào)A
RACSubject *signalA = [RACSubject subject];
// 創(chuàng)建信號(hào)B
RACSubject *signalB = [RACSubject subject];
// 壓縮成一個(gè)信號(hào)
// **-zipWith-**: 當(dāng)一個(gè)界面多個(gè)請求的時(shí)候,要等所有請求完成才更新UI
// 等所有信號(hào)都發(fā)送內(nèi)容的時(shí)候才會(huì)調(diào)用
RACSignal *zipSignal = [signalA zipWith:signalB];
[zipSignal subscribeNext:^(id x) {
NSLog(@"%@", x); //所有的值都被包裝成了元組
}];
// 發(fā)送信號(hào) 交互順序,元組內(nèi)元素的順序不會(huì)變,跟發(fā)送的順序無關(guān),而是跟壓縮的順序有關(guān)[signalA zipWith:signalB]---先是A后是B
[signalA sendNext:@1];
[signalB sendNext:@2];
}
// 任何一個(gè)信號(hào)請求完成都會(huì)被訂閱到
// merge:多個(gè)信號(hào)合并成一個(gè)信號(hào),任何一個(gè)信號(hào)有新值就會(huì)調(diào)用
- (void)merge {
// 創(chuàng)建信號(hào)A
RACSubject *signalA = [RACSubject subject];
// 創(chuàng)建信號(hào)B
RACSubject *signalB = [RACSubject subject];
//組合信號(hào)
RACSignal *mergeSignal = [signalA merge:signalB];
// 訂閱信號(hào)
[mergeSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號(hào)---交換位置則數(shù)據(jù)結(jié)果順序也會(huì)交換
[signalB sendNext:@"下部分"];
[signalA sendNext:@"上部分"];
}
// then --- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先進(jìn)行網(wǎng)絡(luò)請求但是過濾掉數(shù)據(jù),然后進(jìn)行下部分的,拿到下部分?jǐn)?shù)據(jù)
- (void)then {
// 創(chuàng)建信號(hào)A
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求
NSLog(@"----發(fā)送上部分請求---afn");
[subscriber sendNext:@"上部分?jǐn)?shù)據(jù)"];
[subscriber sendCompleted]; // 必須要調(diào)用sendCompleted方法!
return nil;
}];
// 創(chuàng)建信號(hào)B,
RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求
NSLog(@"--發(fā)送下部分請求--afn");
[subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];
[subscriber sendCompleted];
return nil;
}];
// 創(chuàng)建組合信號(hào)
// then;忽略掉第一個(gè)信號(hào)的所有值
RACSignal *thenSignal = [signalA then:^RACSignal *{
// 返回的信號(hào)就是要組合的信號(hào)
return signalsB;
}];
// 訂閱信號(hào)
[thenSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
}
// concat----- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先執(zhí)行,完了之后再讓下部分執(zhí)行(都可獲取值)
- (void)concat {
// 組合
// 創(chuàng)建信號(hào)A
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求
// NSLog(@"----發(fā)送上部分請求---afn");
[subscriber sendNext:@"上部分?jǐn)?shù)據(jù)"];
[subscriber sendCompleted]; // 必須要調(diào)用sendCompleted方法!
return nil;
}];
// 創(chuàng)建信號(hào)B,
RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求
// NSLog(@"--發(fā)送下部分請求--afn");
[subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];
return nil;
}];
// concat:按順序去鏈接
//**-注意-**:concat,第一個(gè)信號(hào)必須要調(diào)用sendCompleted
// 創(chuàng)建組合信號(hào)
RACSignal *concatSignal = [signalA concat:signalsB];
// 訂閱組合信號(hào)
[concatSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
ReactiveCocoa(九) 之RAC合并
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/5...
- 注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/5...
- 信號(hào)signal是RAC的絕對(duì)核心,所有的操作都是圍繞著信號(hào)來處理的。比如:創(chuàng)建信號(hào),訂閱信號(hào),發(fā)送信號(hào)是消息發(fā)送...
- 注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/5...