美文网首页YYKit/Utility
YYTransaction的学习

YYTransaction的学习

作者: _阿南_ | 来源:发表于2017-09-27 15:45 被阅读26次
图片来之网络

看YYTransaction的说明为,创建一个YYTransaction实例,在main runloop休眠前执行传入的target对应的selector。主要功能就是添加target和selector,然后commit,等main runloop休眠前被调用。
那么有添加的地方,而没有删除的地方。

重点代码

实现这个类的功能的主要代码是

transactionSet = [NSMutableSet new];
CFRunLoopRef runloop = CFRunLoopGetMain();
CFRunLoopObserverRef observer;
        
observer = CFRunLoopObserverCreate(CFAllocatorGetDefault(),
                                           kCFRunLoopBeforeWaiting | kCFRunLoopExit,
                                           true,      // repeat
                                           0xFFFFFF,  // after CATransaction(2000000)
                                           YYRunLoopObserverCallBack, NULL);
CFRunLoopAddObserver(runloop, observer, kCFRunLoopCommonModes);
CFRelease(observer);

将需要回调的方法添加到CFRunLoopObserverRef中。

CFRunLoopGetMain

苹果不允许直接创建RunLoop,只提供了自动获取的函数:CFRunLoopGetMain()CFRunLoopGetCurrent()

CFRunLoopObserverCreate

创建一个基于回调函数的CFRunLoopObserver。

CF_EXPORT CFRunLoopObserverRef CFRunLoopObserverCreate(CFAllocatorRef allocator, CFOptionFlags activities, Boolean repeats, CFIndex order, CFRunLoopObserverCallBack callout, CFRunLoopObserverContext *context);

CFOptionFlags的枚举内容有:

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),
    kCFRunLoopBeforeTimers = (1UL << 1),
    kCFRunLoopBeforeSources = (1UL << 2),
    kCFRunLoopBeforeWaiting = (1UL << 5),
    kCFRunLoopAfterWaiting = (1UL << 6),
    kCFRunLoopExit = (1UL << 7),
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};

当在kCFRunLoopBeforeWaiting和kCFRunLoopExit条件时,将会执行YYRunLoopObserverCallBack函数。

CFRunLoopAddObserver

因为CFRunLoopObserver不能直接自动添加到RunLoop中,所以需要调用CFRunLoopAddObserver将observer添加到RunLoop中。

CFRelease(observer);

将observer添加到RunLoop后,需要将observer释放。

重载hash和isEqual方法

重载了NSObject的方法- (NSUInteger)hash- (BOOL)isEqual:(id)object方法,因为在使用transactionSet(为NSMutableSet对象)进行添加对象时,需要进行判断新添加的对象是否与之前已经存在的重复。所以重载了方法,进行target和select的判断。
感谢席萍萍_developer的指点。

疑问

只有commit添加,但是没有删除。那么是不是在runloop中一直会repeat所有commit的方法。那是不是存在很多的无效操作。

// END 求高手赐教。

相关文章

  • YYTransaction的学习

    看YYTransaction的说明为,创建一个YYTransaction实例,在main runloop休眠前执行...

  • YYTransaction源码分析

    YYTransaction源码分析 YYTransaction绘制任务的机制是仿照CoreAnimation的绘制...

  • YYTransaction

    注意 CFRunLoopObserver的用法 并且对于set的创建放入一次执行,然后在commit前调用很巧妙 ...

  • YYTransaction

  • 学习的学习

    “三分钟的热情相信大家都有,但是能够重复思考一个概念,一个知识点,并把它吃透掌握才是大部分人稀缺的能力。”李笑来老...

  • 学习的学习

    不只是学习,听完是不够的。 还要把学到的东西变成方法论、清单式的条目出来去刻意练习。去用,去不断的实践。 有个词 ...

  • 学习的真相|学习「学习」再学习

    不知不觉间,笑来老师在“好的家庭教育”讲的新课《学习的真相》,已经更新到了第12课,关于“学习的真相”这门课,我认...

  • 元学习——关于学习的学习

    元学习是一门关于如何学习的课程。 首先理清几个概念 1、学习是拼图 学习并不是线性的,相反学习是一张信息拼图,类似...

  • 学习,就是学习学习的态度!

    学习,从来都需要态度! 没有了态度,你来了,也不过是躯体入场,思想游荡! 那就学习学习的态度喽!

  • 学习学习再学习的成长

    女儿快要中考了,随着时间的临近,中考紧张气氛越来越浓。成绩一直不太理想的她,也有了紧迫感,不时表露出来“书到用时方...

网友评论

    本文标题:YYTransaction的学习

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