runloop源代码
Posted zzfx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了runloop源代码相关的知识,希望对你有一定的参考价值。
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源代码的主要内容,如果未能解决你的问题,请参考以下文章
你了解 RunLoop 线程保活吗?已封装好,2 句代码直接使用