iOS的runloop的运用
2018-01-20 本文已影响12人
踏云小子
将所有网络请求放在一个子线程里进行,子线程完成任务自动销毁,但是很多线程的创建和销毁很耗资源,所以干脆把子线程放在runloop里,保证不被销毁
NSRunLoop
//XYNetworkingThread.m
+ (NSThread *)shareInstance;
//XYNetworkingThread.h
+ (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");
}
