iOS的runloop

image.png

runloop说白了就是一种循环,只不过是高级的一种循环,一般的while忙等待会让cpu一直工作不停,而runloop是一种“闲”等待,没有事件时候,runloop会休眠,而有事件时候,则会唤醒runloop去调对应的handler去处理

将所有网络请求放在一个子线程里进行,子线程完成任务自动销毁,但是很多线程的创建和销毁很耗资源,所以干脆把子线程放在runloop里,保证不被销毁

NSRunloop与CFRunLoop区别、联系

NSRunLoop

//XYNetworkingThread.h
+ (NSThread *)shareInstance;

//XYNetworkingThread.m
+ (NSThread *)shareInstance {
    static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(addRunLoop) object:nil];
        [_networkRequestThread start];
    });
    return _networkRequestThread;
}

+ (void)addRunLoop{
    @autoreleasepool{
        [[NSThread currentThread] setName:@"XYNetworking"];
        NSRunLoop *runloop = [NSRunLoop currentRunLoop];
        [runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
        [runloop run];
    }
}
image.png

CFRunLoop

主要是addRunLoop方法做了修改

[[NSThread currentThread] setName:@"XYNetworking"];
// Set up a dummy runloop source to avoid spinning
CFRunLoopSourceContext noSpinCtx = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
CFRunLoopSourceRef noSpinSource = CFRunLoopSourceCreate(NULL, 0, &noSpinCtx);
CFRunLoopAddSource(CFRunLoopGetCurrent(), noSpinSource, kCFRunLoopDefaultMode);
CFRelease(noSpinSource);

// run the run loop
while (kCFRunLoopRunStopped != CFRunLoopRunInMode(kCFRunLoopDefaultMode, ((NSDate *)[NSDate distantFuture]).timeIntervalSinceReferenceDate, NO)) {
    NSLog(@"not reached assertion");
}
image.png

参考
iOS RunLoop详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容