.ReactiveCocoa地址
-
RACSiganl
RACSiganl是信號(hào)類(lèi),表示將要有數(shù)據(jù)傳遞观谦,只要有數(shù)據(jù)改變,信號(hào)內(nèi)部接收到數(shù)據(jù)熄诡,就會(huì)發(fā)出數(shù)據(jù)临燃。
// 1.創(chuàng)建信號(hào)
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
// 2.發(fā)送信號(hào)
NSLog(@"RACSignal");
[subscribersendNext:@"data"];
[subscribersendCompleted];
return [RACDisposable disposableWithBlock:^{
// 信號(hào)執(zhí)行完成
NSLog(@"RACDisposable");
}];
}];
// 3.訂閱信號(hào),只有訂閱信號(hào)蒜田,信號(hào)才會(huì)被激活默認(rèn)為冷信號(hào)
[signalsubscribeNext:^(id _Nullablex) {
NSLog(@"x=%@",x);
}error:^(NSError*_Nullableerror) {
NSLog(@"error");
}completed:^{
NSLog(@"completed");
}];
-
RACSubject和RACReplaySubject
RACReplaySubject是RACSubject的子類(lèi)稿械。
RACReplaySubject可以先發(fā)送信號(hào)在訂閱信號(hào);RACSubject必須先訂閱在發(fā)送信號(hào)
// 必須先訂閱在發(fā)送信號(hào)
// 創(chuàng)建信號(hào)
RACSubject *subject = [RACSubject subject];
// 訂閱
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
// 發(fā)送信號(hào)
[subject sendNext:@"data"];
RACReplaySubject *subject = [RACReplaySubject subject];
[subject sendNext:@"123"];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
-
RACSubject界面值傳遞(代理)
TestView.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "ReactiveObjC.h"
NS_ASSUME_NONNULL_BEGIN
@interface TestView : UIView
@property (nonatomic, strong) RACSubject *subject;
@end
NS_ASSUME_NONNULL_END
TestView.m
#import "TestView.h"
@implementation TestView
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.subject sendNext:@"123"];
}
@end
Controller代碼
TestView *view = [[TestView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
view.backgroundColor = UIColor.blueColor;
[self.view addSubview:view];
RACSubject *subject = [RACSubject subject];
view.subject = subject;
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
- RACSequence用于代替NSArray,NSDictionary,可以使用它來(lái)快速遍歷數(shù)組和字典冲粤,字典轉(zhuǎn)模型美莫。
//遍歷數(shù)組
NSArray *ary = @[@"11",@"22",@"33"];
[ary.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//遍歷字典
NSDictionary *dic = @{@"a":@"11",@"b":@"22",@"c":@"33"};
[dic.rac_sequence.signal subscribeNext:^(id _Nullable x) {
RACTupleUnpack(NSString *key, NSString *value) = x;
NSLog(@"%@=%@",key,value);
}];
//字典轉(zhuǎn)模型
NSArray *dicArray = @[@{@"name":@"zhangsan",@"describe":@"zhangsanxxxx"},
@{@"name":@"lisi",@"describe":@"lisixxxx"},
@{@"name":@"wangwu",@"describe":@"wangwuxxxx"}];
NSArray *arrayM = [[dicArray.rac_sequence map:^id _Nullable(id _Nullable value) {
return [TestModel initDic:value];
}] array];
NSLog(@"%@",arrayM);
TestModel
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TestModel : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *describe;
+(instancetype)initDic:(NSDictionary *)dic;
@end
NS_ASSUME_NONNULL_END
#import "TestModel.h"
@implementation TestModel
+(instancetype)initDic:(NSDictionary *)dic{
TestModel *m = [[TestModel alloc] init];
[m setValuesForKeysWithDictionary:dic];
return m;
}
@end
-
RACMulticastConnection
RACMulticastConnection:解決RACSignal副作用
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"信號(hào)被訂閱");
[subscriber sendNext:@"data"];
return nil;
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
代碼執(zhí)行結(jié)果:信號(hào)被訂閱打印兩次EA37D6EF-CDE8-4F51-A318-913D04A04BB4.png
改進(jìn)
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"信號(hào)被訂閱");
[subscriber sendNext:@"data"];
return nil;
}];
// [signal subscribeNext:^(id _Nullable x) {
// NSLog(@"%@",x);
// }];
//
// [signal subscribeNext:^(id _Nullable x) {
// NSLog(@"%@",x);
// }];
RACMulticastConnection *connection = [signal publish];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[connection connect];
執(zhí)行結(jié)果
400FC857-529E-4418-8602-E415B266DF05.png
-
RACCommand
用于處理事件的類(lèi),可用于監(jiān)聽(tīng)按鈕點(diǎn)擊、網(wǎng)絡(luò)請(qǐng)求
// 創(chuàng)建RACCommand
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"RACCommand,%@",input);
// 創(chuàng)建信號(hào)
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"data"];
[subscriber sendCompleted];
return nil;
}];
}];
//訂閱RACCommand中的信號(hào)
// [command.executionSignals subscribeNext:^(id _Nullable x) {
//
// NSLog(@"%@",x);
// [x subscribeNext:^(id _Nullable x) {
// NSLog(@"%@",x);
// }];
// }];
//訂閱RACCommand中的信號(hào)(第二種寫(xiě)法)
[command.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
// 監(jiān)聽(tīng)命令是否執(zhí)行完畢,skip表示跳過(guò)第一次信號(hào)
[[command.executing skip:1] subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue]) {
NSLog(@"正在執(zhí)行");
}else{
NSLog(@"執(zhí)行完成");
}
}];
// 執(zhí)行RACCommand
[command execute:@"11"];
-
代替KVO
rac_valuesForKeyPath
@interface ViewController ()
@property (nonatomic, assign) int count;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//KVO
[[self rac_valuesForKeyPath:@keypath(self, count) observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.count++;
}
RACObserve可以監(jiān)聽(tīng)屬性改變
[RACObserve(self, count) subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
rac_signalForControlEvents監(jiān)聽(tīng)按鈕點(diǎn)擊事件
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[btn setTitle:@"點(diǎn)擊" forState:(UIControlStateNormal)];
btn.backgroundColor = [UIColor blueColor];
[self.view addSubview:btn];
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
rac_addObserverForName代替通知
//監(jiān)聽(tīng)通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"changeName" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@",x);
}];
//發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeName" object:nil userInfo:@{@"name":@"zhangsan"}];
rac_textSignal 監(jiān)聽(tīng)文本改變
UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 44)];
field.backgroundColor = [UIColor yellowColor];
[self.view addSubview:field];
[field.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
rac_liftSelector:withSignalsFromArray:Signals 多個(gè)信號(hào)發(fā)送完成后統(tǒng)一調(diào)用
-(void)demo13{
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"signal1"];
[subscriber sendCompleted];
return nil;
}];
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"signal2"];
[subscriber sendCompleted];
return nil;
}];
[self rac_liftSelector:@selector(endMethods:str2:) withSignalsFromArray:@[signal,signal2]];
}
-(void)endMethods:(NSString *)str1 str2:(NSString *)str2{
NSLog(@"str1 =%@",str1);
NSLog(@"str2 =%@",str2);
}
flattenMap梯捕,Map
簡(jiǎn)單使用
UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 44)];
field.backgroundColor = [UIColor yellowColor];
[self.view addSubview:field];
[[field.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
return [RACReturnSignal return:[NSString stringWithFormat:@"修改文本框輸入的值:%@",value]];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"==%@",x);
}];
[[field.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
return [NSString stringWithFormat:@"修改文本框輸入的值:%@",value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"==%@",x);
}];
concat
按指定順序
RACSubject *s1 = [RACReplaySubject subject];
RACSubject *s2 = [RACReplaySubject subject];
RACSubject *s3 = [RACReplaySubject subject];
[s1 sendNext:@"s1"];
[s1 sendCompleted];
[s2 sendNext:@"s2"];
[s2 sendCompleted];
[s3 sendNext:@"s3"];
[s3 sendCompleted];
[[[s2 concat:s3] concat:s1] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
then:
忽略信號(hào)
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[[self signal1] then:^RACSignal * _Nonnull{
return [self signal2];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
-(RACSignal *)signal1{
RACSubject *signal = [RACReplaySubject subject];
[self loadData1:^(id data) {
//loadDtat2需要loadDtat1的參數(shù)可以在此做記錄
[signal sendNext:data];
[signal sendCompleted];
}];
return signal;
}
-(RACSignal *)signal2{
RACSubject *signal = [RACReplaySubject subject];
[self loadDtat2:^(id data) {
[signal sendNext:data];
[signal sendCompleted];
}];
return signal;
}
-(void)loadData1:(void(^)(id))success{
success(@"第一個(gè)請(qǐng)求數(shù)據(jù)");
}
-(void)loadDtat2:(void(^)(id))success{
success(@"第二個(gè)請(qǐng)求數(shù)據(jù)");
}
merge
:合并信號(hào)厢呵,只要任何一個(gè)信號(hào)發(fā)送數(shù)據(jù),就能訂閱
RACSubject *s1 = [RACReplaySubject subject];
RACSubject *s2 = [RACReplaySubject subject];
RACSubject *s3 = [RACReplaySubject subject];
[s2 sendNext:@"s2"];
[s1 sendNext:@"s1"];
[s3 sendNext:@"s3"];
[[[s3 merge:s1] merge:s2] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
zipWith
: 壓縮信號(hào)數(shù)據(jù)成元組,同時(shí)發(fā)送數(shù)據(jù)
RACSubject *s1 = [RACReplaySubject subject];
RACSubject *s3 = [RACReplaySubject subject];
[s1 sendNext:@"s1"];
[s3 sendNext:@"s3"];
[[s3 zipWith:s1] subscribeNext:^(id _Nullable x) {
RACTupleUnpack(NSString *str1, NSString *str2) = x;
NSLog(@"%@ %@",str1,str2);
}];
combineLatestWith
信號(hào)合并
UITextField *name = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 44)];
name.backgroundColor = [UIColor yellowColor];
[self.view addSubview:name];
UITextField *pwd = [[UITextField alloc] initWithFrame:CGRectMake(100, 150, 200, 44)];
pwd.backgroundColor = [UIColor yellowColor];
[self.view addSubview:pwd];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 100, 100)];
[btn setTitle:@"點(diǎn)擊" forState:(UIControlStateNormal)];
btn.backgroundColor = [UIColor blueColor];
[self.view addSubview:btn];
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
[[name.rac_textSignal combineLatestWith:pwd.rac_textSignal] subscribeNext:^(RACTwoTuple<NSString *,id> * _Nullable x) {
RACTupleUnpack(NSString *name, NSString *pwd) = x;
btn.enabled = name.length > 0 && pwd.length > 0;
}];
combineLatest
信號(hào)合并
UITextField *name = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 44)];
name.backgroundColor = [UIColor yellowColor];
[self.view addSubview:name];
UITextField *pwd = [[UITextField alloc] initWithFrame:CGRectMake(100, 150, 200, 44)];
pwd.backgroundColor = [UIColor yellowColor];
[self.view addSubview:pwd];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 100, 100)];
[btn setTitle:@"點(diǎn)擊" forState:(UIControlStateNormal)];
btn.backgroundColor = [UIColor blueColor];
[self.view addSubview:btn];
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
[[RACSignal combineLatest:@[name.rac_textSignal,pwd.rac_textSignal] reduce:^id(NSString *name ,NSString *pwd){
return @(name.length > 0 && pwd.length > 0);
}] subscribeNext:^(id _Nullable x) {
btn.enabled = [x boolValue];
}];
精簡(jiǎn)寫(xiě)法
RAC(btn,enabled) = [RACSignal combineLatest:@[name.rac_textSignal,pwd.rac_textSignal] reduce:^id(NSString *account,NSString *pwd){
return @(account.length > 0 && pwd.length > 0);
}];
filter
過(guò)濾
UITextField *name = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 44)];
name.backgroundColor = [UIColor yellowColor];
[self.view addSubview:name];
[[name.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 6 && value.length < 10;
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];