https://github.com/zzf073/runloopDemo

/**

*  调度例程

*  当将输入源安装到run loop后,调用这个协调调度例程,将源注册到客户端(可以理解为其他线程)

*

*/

void RunLoopSourceScheduleRoutine (void *info, CFRunLoopRef rl, CFStringRef mode)

{

ZXRunLoopSource* obj = (__bridge ZXRunLoopSource*)info;

//    AppDelegate*   delegate = [[AppDelegate sharedAppDelegate];

AppDelegate*   delegate = [[UIApplication sharedApplication]delegate];

RunLoopContext* theContext = [[RunLoopContext alloc] initWithSource:obj andLoop:rl];

//发送注册请求

[delegate performSelectorOnMainThread:@selector(registerSource:) withObject:theContext waitUntilDone:YES];

}

/**

*  处理例程

*  在输入源被告知(signal source)时,调用这个处理例程,这儿只是简单的调用了 [obj sourceFired]方法

*

*/

void RunLoopSourcePerformRoutine (void *info)

{

ZXRunLoopSource*  obj = (__bridge ZXRunLoopSource*)info;

[obj sourceFired];

//    [NSTimer scheduledTimerWithTimeInterval:1.0 target:obj selector:@selector(timerAction:) userInfo:nil repeats:YES];

}

/**

*  取消例程

*  如果使用CFRunLoopSourceInvalidate/CFRunLoopRemoveSource函数把输入源从run loop里面移除的话,系统会调用这个取消例程,并且把输入源从注册的客户端(可以理解为其他线程)里面移除

*

*/

void RunLoopSourceCancelRoutine (void *info, CFRunLoopRef rl, CFStringRef mode)

{

ZXRunLoopSource* obj = (__bridge ZXRunLoopSource*)info;

AppDelegate* delegate = [AppDelegate sharedAppDelegate];

RunLoopContext* theContext = [[RunLoopContext alloc] initWithSource:obj andLoop:rl];

[delegate performSelectorOnMainThread:@selector(removeSource:) withObject:theContext waitUntilDone:NO];

}

安装输入源到Run Loop---分两步首先初始化一个输入源(init),然后将这个输入源添加到当前Run Loop里面(addToCurrentRunLoop)

CFRunLoopSourceContext  context = {0, (__bridge void *)(self), NULL, NULL, NULL, NULL, NULL,

&RunLoopSourceScheduleRoutine,

RunLoopSourceCancelRoutine,

RunLoopSourcePerformRoutine};

runLoopSource = CFRunLoopSourceCreate(NULL, 0, &context);

commands = [[NSMutableArray alloc] init];

CFRunLoopRef runLoop = CFRunLoopGetCurrent();

CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);

- (void)sourceFired

{

NSLog(@"Source fired: do some work, dude!");

NSThread *thread = [NSThread currentThread];

[thread cancel];

}

runloop源代码的更多相关文章

  1. iOS刨根问底-深入理解RunLoop

    开源的RunloopRef 通常所说的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的OC ...

  2. NSRunLoop

    1.什么是RunLoop 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果 ...

  3. RunLoop(官方文档翻译)

    循环运行 运行循环是与线程相关联的基本基础设施的一部分.一个运行循环是用于调度工作,并协调接收传入事件的事件处理循环.一个运行循环的目的是让你的线程繁忙时,有工作要做,把你的线程时有没有睡觉. 循环运 ...

  4. 在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

    一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.游戏中有一个计时功能在主线程中调用: 1 + (NSTimer *)scheduledTimerWithTimeInterval:( ...

  5. RunLoop基础

    序言 RunLoop一直是比较高级而又比较神秘的技术,一直以来都没有深入去阅读过苹果给出的官方文档.本篇文章就讲讲苹果官方文档中所介绍的RunLoop,再加上其开源性,让我们一起深入去研究其特性及与线 ...

  6. iOS开发 - 啰嗦讲解 Runloop

    写在前面的 为什么要了解 RunLoop?如果你想成为一个高级iOS开发工程师,那这是你必须了解的东西,他能帮助你更好的理解底层实现的原理,可以利用它的特性做出一些高效又神奇的功能.RunLoop这个 ...

  7. RunLoop 之初探

    你好2019!一起努力呀! 1.什么是runloop runloop是通过内部维护的事件循环对事件/消息进行管理的一个对象. 事件循环(Event loop):通俗的解释:没有消息处理的时候,休眠以避 ...

  8. AFNetworking2.0源代码解析

    写在前面给大家推荐一个不错的站点 点击打开链接 本文測试样例源代码下载地址 近期看AFNetworking2的源代码.学习这个知名网络框架的实现.顺便梳理写下文章. AFNetworking的代码还在 ...

  9. 何为RunLoop?RunLoop有哪些应用场景?

    一.RunLoop的作用 一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生 ...

随机推荐

  1. MongoDB 学习笔记(六):备份与用户管理

    一.启动项 1.在启动数据库服务时可以在命令行输入mongod命令,然后直接带一些参数,比如“mongod --dbpath D:\Installations\MongoDB-2.4.6\MongoD ...

  2. spring重点一:处理对象创建时间 个数以及方式

    /** * 1) 对象创建: 单例/多例(个数) * scope="singleton", 默认值, 即 默认是单例 [service/dao/工具类] *  scope=&quo ...

  3. 训练1-S

    给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N < ...

  4. [51nod1074] 约瑟夫问题 V2

    毫无思路,Orz了一下大佬的思路%%%. 大概就是因为k比n小的多,我们知道约瑟夫环有个公式是fn=(fn-1+k) mod n 可以改一下,改成fn+p=(fn+pk) mod (n+p) 但是这样 ...

  5. alg--分治法

    分治--分而治之, 把大的问题分成n个小的问题,分别处理,然后汇总小问题的结果. 具体介绍可以参考这位大哥的blog: https://www.cnblogs.com/steven_oyj/archi ...

  6. php循环练习题

    1.通过for循环将数组中值求和.求平均值 <?php $num=[1,2,3,4,5,6,7,8,9]; $sum = 0; for ($i=0,$n=count($num); $i < ...

  7. snmp--CentOS安装Net-SNMP小计

    http://blog.csdn.net/tmpbook/article/details/39620549

  8. 不可靠信号SIGCHLD丢失的问题

    如果采用 void sig_chld(int signo) {        pid_t pid;        int stat;                while((pid = waitp ...

  9. what we benefit from big data

    大数据玩的是什么,趋势,故障,寿命? 物联网拉动的是终端厂商的销量,作为终端设备生产商(OEM).无论是汽车.手机.家电行业.最有理由推动物联网的普及,可是作为传统行业,玩"网"并 ...

  10. C#高级编程八十三天----程序集的含义

    程序集的含义 一.程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在非常多文件(类,窗口,接口,资源 ...