iOS

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];
    }
}
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
上一篇 下一篇

猜你喜欢

热点阅读