RunLoop篇

作者: 清风徐来121 | 来源:发表于2020-10-28 10:22 被阅读0次
    image.png image.png

    main函数为什么是一直运行的?


    image.png

    RunLoop整个流程图


    image.png image.png image.png image.png image.png
    #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下面
                CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
            }
        }
        
        // 某一时机 静态变量runAlways = NO时 可以保证跳出RunLoop,线程退出
        CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
        CFRelease(source);
    }
    
    @end
    
    image.png

    『RunLoop』详尽总结

    相关文章

      网友评论

        本文标题:RunLoop篇

        本文链接:https://www.haomeiwen.com/subject/ezkqvktx.html