美文网首页
Rac宏操作

Rac宏操作

作者: 我是小胡胡123 | 来源:发表于2018-02-11 15:26 被阅读15次

keypath

一个参数时, 取.后面的子字符串。如果没有.就取字符串本身
二个参数时, 取的第二个参数的字符串。 两个参数,第一个参数的作用在于 自动提示补全OBJ.PATH,实现了代码自动补全的功能

define keypath(...) \

metamacro_if_eq(1, metamacro_argcount(VA_ARGS))(keypath1(VA_ARGS))(keypath2(VA_ARGS))

define keypath1(PATH) \

(((void)(NO && ((void)PATH, NO)), strchr(# PATH, '.') + 1))

define keypath2(OBJ, PATH) \

(((void)(NO && ((void)OBJ.PATH, NO)), # PATH))

keypath(self);      //(((void)(__objc_no && ((void)self, __objc_no)), strchr("self", '.') + 1)) ;
keypath(self.view);     // (((void)(__objc_no && ((void)self.view, __objc_no)), strchr("self.view", '.') + 1)) ;
keypath(self.view.backgroundColor);  //(((void)(__objc_no && ((void)self.view.backgroundColor, __objc_no)), strchr("self.view.backgroundColor", '.') + 1)) ;


keypath(self, view.backgroundColor);     //   (((void)(__objc_no && ((void)self.view.backgroundColor, __objc_no)), "view.backgroundColor"));
keypath(self.view,backgroundColor);     //    (((void)(__objc_no && ((void)self.view.backgroundColor, __objc_no)), "backgroundColor"));
keypath(self.view.backgroundColor,CGColor); //(((void)(__objc_no && ((void)self.view.backgroundColor.CGColor, __objc_no)), "CGColor"));

1、 RACObserve

RACObserve(self, kvoValue);

({ __attribute__((objc_ownership(weak))) id target_ = (self);

[target_ rac_valuesForKeyPath:@(((void)(__objc_no && ((void)self.kvoValue, __objc_no)), "kvoValue")) observer:self]; });

  • (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer {
    return [[[self
    rac_valuesAndChangesForKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:observer]
    map:^(RACTuple *value) {
    // -map: because it doesn't require the block trampoline that -reduceEach: uses
    return value[0];
    }]
    setNameWithFormat:@"RACObserve(%@, %@)", RACDescription(self), keyPath];
    }

2、 RACChannelTo
RACChannelTo(self.view, backgroundColor) = RACChannelTo(self,sscolor);

[[RACKVOChannel alloc] initWithTarget:(self.view) keyPath:

@(((void)(__objc_no && ((void)self.view.backgroundColor, __objc_no)), "backgroundColor"))
nilValue:(((void *)0))]
[@(((void)(__objc_no && ((void)RACKVOChannel.new.followingTerminal, __objc_no)), "followingTerminal"))]

= [[RACKVOChannel alloc] initWithTarget:(self) keyPath:
@(((void)(__objc_no && ((void)self.sscolor, __objc_no)), "sscolor"))
nilValue:(((void *)0))]

[@(((void)(__objc_no && ((void)RACKVOChannel.new.followingTerminal, __objc_no)), "followingTerminal"))] ;

// 下标操作

@implementation RACKVOChannel (RACChannelTo)

  • (RACChannelTerminal *)objectForKeyedSubscript:(NSString *)key {
    NSCParameterAssert(key != nil);

    RACChannelTerminal *terminal = [self valueForKey:key];
    NSCAssert([terminal isKindOfClass:RACChannelTerminal.class], @"Key "%@" does not identify a channel terminal", key);

    return terminal;
    }

  • (void)setObject:(RACChannelTerminal *)otherTerminal forKeyedSubscript:(NSString *)key {
    NSCParameterAssert(otherTerminal != nil);

    RACChannelTerminal *selfTerminal = [self objectForKeyedSubscript:key];
    [otherTerminal subscribe:selfTerminal];
    [[selfTerminal skip:1] subscribe:otherTerminal];
    }

3、 RAC

[[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET) nilValue:(NILVALUE)][@keypath(TARGET, KEYPATH)]



 [[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(self.view) nilValue:([UIColor redColor])]

[@(((void)(__objc_no && ((void)self.view.backgroundColor, __objc_no)),

"backgroundColor"))]=a;

// 下标操作

  • (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath {
    [signal setKeyPath:keyPath onObject:self.target nilValue:self.nilValue];
    }

相关文章

  • Rac宏操作

    keypath 一个参数时, 取.后面的子字符串。如果没有.就取字符串本身二个参数时, 取的第二个参数的字符串。 ...

  • ReactiveCocoa 之 @weakify/@strong

    @weakify 和 @strongify 是 RAC 中对于强弱引用操作的宏定义。 1. 拆解宏定义 下面的代码...

  • RAC使用

    RAC常用宏 KVO监听使用 RAC宏使用 信号类使用 使用信号模拟代理 rac_sequence遍历字典 解包元...

  • 小驴拉磨之—ReactiveCocao(RAC)一些重要的宏

    使用过RAC的都知道RAC的宏是非常强大的,在这我给大家介绍一些重要的宏。 元宏(RAC中最基本一个宏,PS:那个...

  • RAC宏

    一、基础宏 1.metamacro_stringify 这样写的目的是预防参数中传入宏定以后,以宏定义的名字做为参...

  • RxSwift介绍(一)——RxSwift初探

    之前介绍了RAC在Objective-C环境下RACSignal信号订阅使用流程、宏定义以及各种信号的操作使用。作...

  • RAC一些常见用法(五)

    本demo详见github 1.常见的用法 2.RAC常见的宏 3.发送验证码 友情链接: RAC(一) RAC(...

  • ReactiveCocoa在swift情况下使用宏

    在swift的环境下,配置RAC和RACObserve宏需要另外添加文件,如下: 在学习swift导入RAC的过程...

  • RAC-宏

    一、概要 RAC :给某个对象绑定一个属性 RACObserve :监听某个对象的某个属性 RACTuplePac...

  • RAC宏介绍

    1、RAC::把一个对象的某个属性绑定一个信号,只要发出信号,就会把信号的内容给对象的属性赋值 // 例如:给la...

网友评论

      本文标题:Rac宏操作

      本文链接:https://www.haomeiwen.com/subject/jpoktftx.html