其他分享
首页 > 其他分享> > iOS RunLoop与NSTimer RunLoop与多线程

iOS RunLoop与NSTimer RunLoop与多线程

作者:互联网

返回上级目录:iOS面试专题一

文章目录

1.RunLoop与NSTimer

1.1 CFRunLoopAddTimer源码分析

源码下载地址:https://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz

2.RunLoop与多线程

2.1 怎样实现一个常驻线程

2.1.1 实例代码MCObject.m

#import "MCObject.h"

@implementation MCObject

static NSThread *thread = nil;
// 标记是否要继续事件循环
static BOOL runAlways = YES;

+ (NSThread *)threadForDispatch{
    if (thread == nil) {
        @synchronized(self) {
            if (thread == nil) {
                // 线程的创建
                thread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequest) object:nil];
                [thread setName:@"com.imooc.thread"];
                //启动
                [thread start];
            }
        }
    }
    return thread;
}

+ (void)runRequest
{
    // 创建一个Source
    CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
    CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
    
    // 创建RunLoop,同时向RunLoop的DefaultMode下面添加Source
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    
    // 如果可以运行
    while (runAlways) {
        @autoreleasepool {
            // 令当前RunLoop运行在DefaultMode下面,第二个参数,运行到指定事件结束,1.0e10为无穷大。第三个参数,资源被处理后是否返回
            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
        }
    }
    
    // 某一时机 静态变量runAlways = NO时 可以保证跳出RunLoop,线程退出。source移除后,runloop会退出
    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    CFRelease(source);
}

@end

标签:NULL,thread,MCObject,iOS,source,线程,多线程,RunLoop
来源: https://blog.csdn.net/baidu_40537062/article/details/118892085