@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];
}
// 把多個信號聚合成你想要的信號,使用場景----:比如-當(dāng)多個輸入框都有值的時候按鈕才可點擊。
// 思路--- 就是把輸入框輸入值的信號都聚合成按鈕是否能點擊的信號满钟。
- (void)combineLatest {
RACSignal *combinSignal = [RACSignal combineLatest:@[self.accountField.rac_textSignal, self.pwdField.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ //reduce里的參數(shù)一定要和combineLatest數(shù)組里的一一對應(yīng)茸俭。
// block: 只要源信號發(fā)送內(nèi)容专控,就會調(diào)用,組合成一個新值结缚。
NSLog(@"%@ %@", account, pwd);
return @(account.length && pwd.length);
}];
// // 訂閱信號
// [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:把兩個信號壓縮成一個信號奋刽,只有當(dāng)兩個信號同時發(fā)出信號內(nèi)容時备典,并且把兩個信號的內(nèi)容合并成一個元祖异旧,才會觸發(fā)壓縮流的next事件。
// 創(chuàng)建信號A
RACSubject *signalA = [RACSubject subject];
// 創(chuàng)建信號B
RACSubject *signalB = [RACSubject subject];
// 壓縮成一個信號
// **-zipWith-**: 當(dāng)一個界面多個請求的時候提佣,要等所有請求完成才更新UI
// 等所有信號都發(fā)送內(nèi)容的時候才會調(diào)用
RACSignal *zipSignal = [signalA zipWith:signalB];
[zipSignal subscribeNext:^(id x) {
NSLog(@"%@", x); //所有的值都被包裝成了元組
}];
// 發(fā)送信號 交互順序吮蛹,元組內(nèi)元素的順序不會變,跟發(fā)送的順序無關(guān)拌屏,而是跟壓縮的順序有關(guān)[signalA zipWith:signalB]---先是A后是B
[signalA sendNext:@1];
[signalB sendNext:@2];
}
// 任何一個信號請求完成都會被訂閱到
// merge:多個信號合并成一個信號潮针,任何一個信號有新值就會調(diào)用
- (void)merge {
// 創(chuàng)建信號A
RACSubject *signalA = [RACSubject subject];
// 創(chuàng)建信號B
RACSubject *signalB = [RACSubject subject];
//組合信號
RACSignal *mergeSignal = [signalA merge:signalB];
// 訂閱信號
[mergeSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號---交換位置則數(shù)據(jù)結(jié)果順序也會交換
[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)建信號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)建信號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)建組合信號
// then;忽略掉第一個信號的所有值
RACSignal *thenSignal = [signalA then:^RACSignal *{
// 返回的信號就是要組合的信號
return signalsB;
}];
// 訂閱信號
[thenSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
}
// concat----- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先執(zhí)行务唐,完了之后再讓下部分執(zhí)行(都可獲取值)
- (void)concat {
// 組合
// 創(chuàng)建信號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)建信號B带兜,
RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求
// NSLog(@"--發(fā)送下部分請求--afn");
[subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];
return nil;
}];
// concat:按順序去鏈接
//**-注意-**:concat枫笛,第一個信號必須要調(diào)用sendCompleted
// 創(chuàng)建組合信號
RACSignal *concatSignal = [signalA concat:signalsB];
// 訂閱組合信號
[concatSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
ReactiveCocoa(九) 之RAC合并
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭变,“玉大人颜价,你說我怎么就攤上這事∷弑簦” “怎么了周伦?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長未荒。 經(jīng)常有香客問我专挪,道長,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任寨腔,我火速辦了婚禮困肩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脆侮。我一直安慰自己锌畸,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布靖避。 她就那樣靜靜地躺著潭枣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幻捏。 梳的紋絲不亂的頭發(fā)上盆犁,一...
- 文/蒼蘭香墨 我猛地睜開眼沛善,長吁一口氣:“原來是場噩夢啊……” “哼航揉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起金刁,我...
- 正文 年R本政府宣布,位于F島的核電站衷笋,受9級特大地震影響芳杏,放射性物質(zhì)發(fā)生泄漏矩屁。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一爵赵、第九天 我趴在偏房一處隱蔽的房頂上張望吝秕。 院中可真熱鬧,春花似錦空幻、人聲如沸烁峭。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽约郁。三九已至,卻和暖如春但两,著一層夾襖步出監(jiā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...
- 信號signal是RAC的絕對核心艘绍,所有的操作都是圍繞著信號來處理的。比如:創(chuàng)建信號秫筏,訂閱信號,發(fā)送信號是消息發(fā)送...
- 注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/5...