1.dispatch_apply函數(shù)作用:把一項任務(wù)提交到隊列中多次執(zhí)行,具體是串行執(zhí)行還是并行執(zhí)行由隊列本身決定
注意:dispatch_apply不會立即返回,在執(zhí)行完畢后才會返回,是同步的調(diào)用
size_t iterations: 執(zhí)行的次數(shù)
dispatch_queue_t queue: 提交的隊列
block 執(zhí)行的任務(wù)
size_t block中每次任務(wù)執(zhí)行的索引
如果在for循環(huán)中使用dispatch_async, 需要管理好線程的數(shù)量,否則會發(fā)生線程爆炸或死鎖。
而且我們看到,其實很多操作都是在一個線程執(zhí)行的,因為這個線程事情執(zhí)行完了,空出來了,那么其他時間就有可能調(diào)用這個線程做一些事情這個時候我們調(diào)用,就會有一些預料不到的情況(雖然我還沒遇到)。
這種情況下,系統(tǒng)會自己分配資源,管理隊列,及隊列里面執(zhí)行事件的線程,更加安全,效率也會更高(肯定也會出現(xiàn)一些線程執(zhí)行完一件事情,空下來待會兒執(zhí)行隊列里面的其他事件)。
如果我們 將DISPATCH_QUEUE_CONCURRENT 改成DISPATCH_QUEUE_SERIAL ,會發(fā)現(xiàn),變成了串行執(zhí)行,不同的是,事件順序執(zhí)行,而且都在一個線程(串行的嘛)。
我們后面的log,和barrier都是在執(zhí)行所有的apply 之后執(zhí)行的,這是個阻塞的工作。我們想并發(fā),可以將整個apply放到一個隊列,異步的執(zhí)行。