RAC使用
2017-10-30 本文已影响14人
Vijay_
RAC常用宏
//kvo监听
[RACObserve(self.view, center) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 只要文本框文字改变,就会修改label的文字,将ui属性绑定其他ui信号属性
RAC(self.labelView,text) = _textField.rac_textSignal;
// 把参数中的数据包装成元组
RACTuple *tuple = RACTuplePack(@10,@20);
//解包
RACTupleUnpack($param,...) = tuple;
KVO监听使用
//注意 在block中使用self.时会出现强引用 必须使用@weakify(self)和@strongify(self)来组合
@weakify(self) //此处创建一个弱引用的self
[RACObserve($对象,$属性) subscribeNext:^(id x){
@strongify(self) //此处创建一个强引用的self指向外面的弱引用self
//当对象的被监听属性发生改变时调用 x为新值
}
RAC宏使用
##当kvo监听的属性发生变化是RAC宏监听的属性也会跟随变化
RAC($target,$property) = RACObserve($target,$property);
##监听多个信号处理后,给RAC监听的属性赋值
RAC($target,$property) = RAC(self,enabled) = [RACSignal combineLatest:@[RACObserve(self.obj, name)] reduce:^(NSString* name){
return name;
}];
##单纯绑定信号
RACSubject *sub = [RACSubject subject];
RAC(self,enabled) = sub;
[sub sendNext:@"hello"];
NSLog(@"%@",self.enabled);
[sub sendNext:@"hello22"];
NSLog(@"%@",self.enabled);
##注意 如果要绑定ui控件的事件返回值的话要使用提供的rac信号事件
##,底层是监听事件后发送控件值的Signal对象
RAC(lable,text) = textfield.rac_textSignal;
信号类使用
//RACSignal信号类使用(先储存发送的信号,然后订阅信号时发送)
RACSignal* signal = [RACSignal crateSignal:
^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull
//subscriber是订阅者 必须实现RACSubscriber协议
subscriber){
//发送信号
[subscriber sendNext:@"signal"];
//信号发送完后最好调用结束方法
[subscriber sendCompleted];
//需要返回一个RACDisposable对象
return [RACDisposable disableWithBlock:^{
//当信号释放时调用该block
}];
}];
//订阅信号 并接收信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"收到数据%@",x);
}];
##RACSubject信号类使用(先储存订阅函数,然后在发送信号时调用所有订阅函数);
##RACReplaySubject信号类使用(先储存发送的信号内容,然后在订阅信号时遍历所有的信号调用函数);
使用信号模拟代理
//Signal.h
@property (nonatomic,retain)RACSubject* subject;
//Signal.m
- (RACSubject *)subject{
if (!_subject) {
//注意 不能使用self.subject 会调用subject方法 造成死循环
_subject = [RACSubject subject];
[_subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
return _subject;
}
//调用
Signal* si = [[Signal alloc] init];
[si.subject sendNext:@"hello"];
rac_sequence遍历字典 解包元组
NSMutableDictionary* dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:@11 forKey:@"age"];
[dictionary.rac_sequence.signal subscribeNext:^(RACTuple* x) {
//解包元组
RACTupleUnpack(NSString* key,NSNumber* val) = x;
// 相当于以下写法
// NSString *key = x[0];
// NSString *value = x[1];
YPLog(@"%@---%@",key,val);
}];
事件、指令(rac_command)
#在有事件的ui控件中会补充一个rac_command属性用作控件的事件指令
#该属性需要一个绑定了信号的指令对象
#给指令的信号对象订阅函数 当控件事件触发时会调用指令对象绑定的信号
btn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable button) {
RACReplaySubject* sub =[RACReplaySubject subject];
[sub sendNext:@"hello"];
return sub;
}];
[btn.rac_command.executionSignals subscribeNext:^(id x) {
RACReplaySubject* s = x;
[s subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
异步操作
RACSignal* s1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"1"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
}];
}];
RACSignal* s2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"2"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
}];
}];
[s1 subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[s2 subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[[RACSignal merge:@[s1,s2]] subscribeCompleted:^{
NSLog(@"both down");
}];
链式函数
# flattenMap相当于给当前信号订阅上函数
# 然后返回一个新的信号然后可以一直给该信号使用flattenMap链式订阅函数,
# 每个订阅函数执行完后会自动销毁当前信号 并要求返回一个新的信号
#then函数功能和flattenMap一样 作为链式调用,但是它的block无法
#接受上个信号对象发送的信号,并且不会结束信号
RACSignal* s1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"1"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
}];
}];
RACSignal* s2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"2"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
}];
}];
[[[s1 flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
NSLog(@"---%@",value);
return s2;
}] flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) {
NSLog(@"---%@",value);
return s2;
}]subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
获取UI控件事件信号进行使用
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside ] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];