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. forEach 列出数组的每个元素:

    数组.forEach便利所有的元素 array.forEach(function(currentValue, index, arr), thisValue) function(currentValue ...

  2. C# word生成html

    引入 Aspose.Words public void ConvertToHtml(string wordPath, string savaPath) { try { Aspose.Words.Doc ...

  3. 网络是通的 yum用不了

    Loaded plugins: fastestmirror, langpacks One of the configured repositories failed (Unknown),and yum ...

  4. 何为JQuery对象?

  5. wamp的安装配置

    WAMP是指在Windows服务器上使用Apache.MySQL和PHP的集成安装环境,可以快速安装配置Web服务器. 一.下载安装包 进入官网下载:http://www.wampserver.com ...

  6. Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)A. Friends Meeting

    Two friends are on the coordinate axis Ox in points with integer coordinates. One of them is in the ...

  7. 兼容IE的两端对齐

    div+css布局实现2端对齐是我们网页排版中经常会使用到的,这篇文章将总结一下可以实现的方法: html结构 实现demo里面的div通过Css进行2端对齐. <div class=" ...

  8. luogu P4756 Added Sequence(凸包+思维)

    一眼望去不会. 考虑问题中的\(f(i,j)=|\sum_{p=i}^{j}​a_p​ |\)的实际意义. 其实就是前缀和相减的绝对值. \(f(i,j)=|\ sum[j]-sum[i-1]\ |\ ...

  9. HDU1241 - Oil Deposits【DFS】

    GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块.他们通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石 ...

  10. Centos上Mysql5.6的安装

    安装步骤: (1)查看Centos是否自带mysql :rpm -qa | grep mysql (2)将原有卸载     rpm -e --nodeps mysql-libs-5.1.73-5.el ...