GCD面试题简析

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"3");
    });
}

- (void)test{
    NSLog(@"2");
}

打印结果 为 1 3

dispatch_get_global_queue(0, 0) 是一个全局并发队列,在子线程中没有开启runloop.

performSelector:withObject:afterDelay: 方法依赖于 Run Loop 的运行,并且默认在 NSDefaultRunLoopMode 下运行。而子线程中runloop是默认关闭的。
当调用 performSelector:afterDelay: 时,其实内部会创建一个定时器,注册到当前线程的 RunLoop 中(如果当前线程没有 RunLoop,这个方法就会失效)。
有时候会看到 afterDelay:0,这样的作用是避免在当前的这个循环中执行,等下一次循环再执行。比方有时候会判断当前的 Mode 是否是 Tracking 或者 Default,为了避免判断错误,会使用 afterDelay:0 的方式将判断延迟到下一次 RunLoop 再执行。

在gcd中使用延迟调用的方法,使用diapatch_after为佳。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容