1.dispatch_apply函数作用:把一项任务提交到队列中多次执行,具体是串行执行还是并行执行由队列本身决定
注意:dispatch_apply不会立即返回,在执行完毕后才会返回,是同步的调用
size_t iterations: 执行的次数
dispatch_queue_t queue: 提交的队列
block 执行的任务
size_t block中每次任务执行的索引


如果在for循环中使用dispatch_async, 需要管理好线程的数量,否则会发生线程爆炸或死锁。
而且我们看到,其实很多操作都是在一个线程执行的,因为这个线程事情执行完了,空出来了,那么其他时间就有可能调用这个线程做一些事情这个时候我们调用,就会有一些预料不到的情况(虽然我还没遇到)。

这种情况下,系统会自己分配资源,管理队列,及队列里面执行事件的线程,更加安全,效率也会更高(肯定也会出现一些线程执行完一件事情,空下来待会儿执行队列里面的其他事件)。
如果我们 将DISPATCH_QUEUE_CONCURRENT 改成DISPATCH_QUEUE_SERIAL ,会发现,变成了串行执行,不同的是,事件顺序执行,而且都在一个线程(串行的嘛)。
我们后面的log,和barrier都是在执行所有的apply 之后执行的,这是个阻塞的工作。我们想并发,可以将整个apply放到一个队列,异步的执行。
网友评论