前言
自己百度看了幾篇ReactiveObjc的使用文章贮缅,隨后自己創(chuàng)建一個Demo跟著敲了一波.看懂不如手動跟著敲一遍战秋,至少增強了自己的記憶力。不喜勿噴版姑≈眩……
RACSignal
默認是冷信號,只有訂閱了這個信號才會會變?yōu)闊嵝盘?/p>
//創(chuàng)建信號
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"Hello word"];
[subscriber sendCompleted]; // 如果不在發(fā)送數(shù)據(jù)剥险,最好發(fā)送信號完成聪蘸,內部會自動調用[RACDisposable disposable]取消訂閱信號
return [RACDisposable disposableWithBlock:^{
//block調用時刻:當信號發(fā)送完成或者發(fā)送錯誤,就會自動執(zhí)行這個block,取消訂閱信號
// 執(zhí)行完Block后表制,當前信號就不在被訂閱了健爬。
NSLog(@"銷毀了");
}];
}];
//訂閱信號
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"接收到了 %@",x);
}];
//輸出:接收到了 Hello word
//銷毀了
RACDisposable
RACDisposable * disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"接收到了 %@",x);
}];
[disposable dispose];
RACSubject
RACSubject:信號提供者,自己可以充當信號么介,又能發(fā)送信號.通常用來代替代理
使用方法
1.創(chuàng)建信號 [RACSubject subject]娜遵,跟RACSiganl不一樣,創(chuàng)建信號時沒有block壤短。
2.訂閱信號 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
3.發(fā)送信號 sendNext:(id)value
RACSubject * subject = [RACSubject subject];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"1.接收到了%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"2.接收到了%@",x);
}];
[subject sendNext:@"hello word"];
[subject sendCompleted];
//輸出: 1.接收到了hello word
//2.接收到了hello word
RACReplaySubject
遍歷保存的所有值设拟,一個一個調用訂閱者的nextBlock
RACReplaySubject * replaySub = [RACReplaySubject subject];
[replaySub sendNext:@"hello"];
[replaySub sendNext:@"kitty"];
[replaySub subscribeNext:^(id _Nullable x) {
NSLog(@"1.接收到了%@",x);
}];
[replaySub subscribeNext:^(id _Nullable x) {
NSLog(@"2.接收到了%@",x);
}];
/*
輸出:1.接收到了hello
1.接收到了kitty
2.接收到了hello
2.接收到了kitty
*/
RACMulticastConnection
RACMulticastConnection是為了解決多次調用創(chuàng)建信號的Block。
//創(chuàng)建信號
NSLog(@"=============================");
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"發(fā)送請求");
[subscriber sendNext:@"1"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"銷毀了");
}];
}];
RACMulticastConnection * connect = [signal publish];
[connect.signal subscribeNext:^(id _Nullable x) {
NSLog(@"1.接收到了%@",x);
}];
[connect.signal subscribeNext:^(id _Nullable x) {
NSLog(@"2.接收到了%@",x);
}];
[connect connect];
RACCommand
這塊理解有點模糊久脯,智商不夠
RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"執(zhí)行命令");
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"請求數(shù)據(jù)"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"數(shù)據(jù)銷毀");
}];
}];
}];
_command = command;
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue]== YES) {
NSLog(@"當前正在執(zhí)行,%@",x);
}else{
NSLog(@"執(zhí)行完成,%@",x);
}
}];
[self.command execute:@1];
記錄的函數(shù)
combineLatest
/*
此代碼是將combineLatest:后面的數(shù)組中的信合打包成為一個新的信號蒜绽。只有當兩個信號都成功發(fā)送過信號的時候打包后的信號才能正常執(zhí)行訂閱后的代碼塊。
*/
RACSubject * one = [RACSubject subject];
RACSubject * two = [RACSubject subject];
[[RACSignal combineLatest:@[one,two]] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"信號發(fā)送combineLatest");
}];
[one sendNext:@"one"];
[two sendNext:@"two"];
concat合并
按一定順序拼接信號桶现,當多個信號發(fā)出的時候躲雅,有順序的接收信號
zip
zip:是把多個信號壓縮成一個信號,當每個信號都有返回值時壓縮成一個元組(RACTuple)返回骡和,元組內值的順序只與壓縮順序有關相赁。
merge
/*
此代碼可以將merge:后數(shù)組中的信號合并為一個信號。只有有任意一個信號完成信息的發(fā)送慰于。那么合并后的信號就可以正常的接收到信號钮科。
*/
RACSubject * one = [RACSubject subject];
RACSubject * two = [RACSubject subject];
[[RACSignal merge:@[one,two]] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"信號發(fā)送combineLatest,%@",x);
}];
// [one sendNext:@"one"];
[two sendNext:@"two"];
flattenMap 信號過濾
flattenMap 的底層實現(xiàn)是通過bind實現(xiàn)的。拿到原數(shù)據(jù)婆赠,處理完成之后绵脯,包裝成信號返回
[[self.textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
return [RACSignal return:[NSString stringWithFormat:@"輸入文本: %@", value]];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"輸入文本 : %@", x);
}];
Map 信號過濾
flattenMap 的底層實現(xiàn)是通過bind實現(xiàn)的。拿到原數(shù)據(jù),處理完成之后蛆挫,包裝成信號返回
[self.textField.rac_textSignal map:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
return [NSString stringWithFormat:@"輸入文本: %@", value]];
}]
在界面中寫一波
需求:賬號與密碼都輸入后登錄才可以點擊赃承,登錄按鈕變顏色
//登錄按鈕點擊
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"button點擊了");
}];
//登錄按鈕是否有效
RAC( self.button ,enabled) = [RACSignal combineLatest:@[self.accountTF.rac_textSignal,self.psdTF.rac_textSignal ] reduce:^id (NSString *string, NSString *number) {
NSLog(@"====%@%@",string,number);
return @(string.length && number.length);
}];
//登錄按鈕顏色改變
RAC(self.button,backgroundColor) = [RACSignal combineLatest:@[self.accountTF.rac_textSignal,self.psdTF.rac_textSignal] reduce:^id _Nonnull(NSString * account,NSString * psd){
UIColor * color = [UIColor grayColor];
if (account.length&& psd.length) {
color = [UIColor orangeColor];
}
return color;
}];
//賬號
[[self.accountTF rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"輸入賬號: %@",x);
}];
//密碼
[[self.psdTF rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"輸入密碼; %@",x);
}];
算一點點運用了悴侵,只是登錄接口該怎么寫還不會瞧剖。哈哈~