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 句代码直接使用

探索 RunLoop (RunLoop 自己动手实现RunLoop)

关于RunLoop部分源码的注释

关于RunLoop部分源码的注释

iOS高级-RunLooper

RunLoop总结:RunLoop的应用场景