《iOS面试之道》-“串行队列的代码实战” 勘误

Posted 兜兜有糖的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《iOS面试之道》-“串行队列的代码实战” 勘误相关的知识,希望对你有一定的参考价值。

一、原书第一版154页开始讲解串行队列、并发队列、以及在Dispatch_Async、Dispatch_Sync下面的作用

  最后一段代码:

    if(_q == NULL)
    {
        _q = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);
    }
    
    NSMutableString *str = [[NSMutableString alloc] init];
    [str appendString:@"1"];
    dispatch_sync(_q, ^{
        [str appendString:@"2"];
        dispatch_async(_q, ^{
            [str appendString:@"3"];
        });
        [str appendString:@"4"];
    });
    [str appendString:@"5"];
    NSLog(@"%@", str);

  代码如上面,最后输出的数字代表执行顺序。书中最后说顺序会输出两个结果,12345、12435、3一定会在4之前被打印出来

  看到这里觉得有些不对,写了代码试了一下,3是绝对不会出现在4之前的。即使在4之前加上延时,也不会

  新建App工程,将下面的代码放在ViewDidload中

    if(_q == NULL)
    {
        _q = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);
    }
    
    NSMutableString *str = [[NSMutableString alloc] init];
    [str appendString:@"1"];
    dispatch_sync(_q, ^{
        [str appendString:@"2"];
        dispatch_async(_q, ^{
            [str appendString:@"3"];
        });
        [NSThread sleepForTimeInterval:10];
        [str appendString:@"4"];
    });
    [str appendString:@"5"];
    NSLog(@"%@", str);

  加上10s延时,输出12453.

  原书的结论错误。

  正确的结果是,出现12453或者12435,24一定出现在3之前。

  因为首先Dispatch_Sync表示将一个block入队列,并且等待该队列执行完毕,所以先输出12

  Dispatch_Async表示将一个block入队列,立即返回,因为入的是串行队列所以不能并发执行,需要等待队列中之前的任务执行完毕,所以3一定在4之后才能执行

  3和5谁先执行,需要看线程切换的顺序,不能够确定。

  

以上是关于《iOS面试之道》-“串行队列的代码实战” 勘误的主要内容,如果未能解决你的问题,请参考以下文章

《WINDOWS黑客编程技术详解》勘误收集及软件下载

线性代数笔记的一处勘误

前端面试之道 (高清彩图)

一线大厂面试之道--腾讯阿里Android高级开发面试官选拔标准

Java面试之道,让你轻松拿offer

秋招华为架构分享,深谙面试之道的Java面试八股文