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];
}
}
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");
}