首页 文章

如果我在dispatch_async块中有dispatch_sync调用后跟第二个调度调用,那么第二个调用是同步还是异步是否重要?

提问于
浏览
3

这段代码是针对一个非常标准的情况,我让我的数据模型执行一些可能很慢的数据检索,并且我想在数据检索完成后用数据更新我的视图 .

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    dispatch_sync(queue, ^{
        //get a bunch of data
    }
    dispatch_sync(dispatch_get_main_queue(), ^{
        [viewcontroller tellViewToReloadData];
    }
}

我的问题是,如果第二个dispatch_sync是dispatch_async,它会有多大的区别吗?

这是我对上面代码发生的事情的理解(我也用它来衡量我对这个整体主题的理解):

  • 外部dispatch_async立即返回,并且具有两个调度调用的块被放入并发队列 .

  • 在某些时候,外部异步块将在某个随机线程上执行,此时第一个dispatch_sync被调用,其块被放入并发队列 .

  • 在某些时候,内部第一个同步块将在某个随机线程上执行我的所有数据收集操作,并且只有当它们全部完成时,第一个dispatch_sync将返回,第二个dispatch_sync将被调用 .

  • 调用第二个dispatch_sync,并将包含更新视图的代码的块放入主队列 . 在某些时候,该块执行并且视图得到更新,第二个dispatch_sync返回 .

  • 外部块现在已完成执行,因此并发队列可以自由地将任务推送到正在执行外部块的线程 .

现在,我的理解是,如果第二个dispatch_sync是dispatch_async调用,唯一的变化是执行外部块的线程被占用的时间稍短,因为它不必等待主块中的块队列完成执行 . 它是否正确?通过这种推理,第二个dispatch_sync似乎稍微好一点,因为某个线程将被占用(可能很简单)更短的时间,但实际上并不重要 .

1 回答

  • 2
    • 第一次同步毫无意义 - 你已经在 queue .
    dispatch_async(queue, ^{
        //get a bunch of data
        dispatch_sync(dispatch_get_main_queue(), ^{
            [viewcontroller tellViewToReloadData];
        });
    });
    
    • sync 只是带有等待原语的 async ,好像它是:
    dispatch_semaphore_t s = dispatch_semaphore_create(0);
    
    dispatch_async(queue, ^{
        [viewcontroller tellViewToReloadData];
        dispatch_semaphore_signal(s);
    });
    
    dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
    

    现在,我的理解是,如果第二个dispatch_sync是dispatch_async调用,唯一的变化是执行外部块的线程被占用的时间稍短,因为它不必等待块中的块 . 主队列完成执行 . 它是否正确?

    是 .

    通过这种推理,第二个dispatch_sync似乎稍微好一点,因为某个线程将被占用(可能很简单)更短的时间,但实际上并不重要 .

    在许多线程等待主线程完成处于压力负载下的情况下,这可能很重要 . 然后系统需要生成更多的pthread来继续有效地执行其他并发任务,然后关闭过多的线程 . 可以't tell if that applies, but obviously there is no need to wait if you don't需要结果 .

相关问题