
image.png
runloop說白了就是一種循環(huán),只不過是高級的一種循環(huán),一般的while忙等待會讓cpu一直工作不停,而runloop是一種“閑”等待,沒有事件時候,runloop會休眠,而有事件時候,則會喚醒runloop去調(diào)對應(yīng)的handler去處理
將所有網(wǎng)絡(luò)請求放在一個子線程里進(jìn)行,子線程完成任務(wù)自動銷毀,但是很多線程的創(chuàng)建和銷毀很耗資源,所以干脆把子線程放在runloop里,保證不被銷毀
NSRunloop與CFRunLoop區(qū)別、聯(lián)系
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