首先解釋下標(biāo)題里地括號(hào)是什么意思溶推,GCD有個(gè)函數(shù)叫dispatch_barrier_async,還有個(gè)函數(shù)叫dispatch_barrier_sync,這個(gè)括號(hào)只是用來防止標(biāo)題取得太長(zhǎng)…>_<
對(duì)于dispatch_barrier_async可能有的朋友沒用過铣减,不知道它是干嘛的,簡(jiǎn)單地介紹一下下脚作,知道的朋友可以跳過此段葫哗。
假設(shè)我們?cè)扔?個(gè)任務(wù)要執(zhí)行,我們現(xiàn)在要插入一個(gè)任務(wù)0,這個(gè)任務(wù)0要在1劣针、2桨螺、3都并發(fā)執(zhí)行完了之后才能執(zhí)行,而4酿秸、5灭翔、6號(hào)任務(wù)要在這個(gè)任務(wù)0結(jié)束后才允許并發(fā)。大致的意思就跟下面這個(gè)圖一樣
對(duì)于這樣一種需求辣苏,很多朋友的第一反應(yīng)就是用個(gè)group就解決了肝箱。確實(shí)如此,但是系統(tǒng)提供了一種更加簡(jiǎn)單地方法稀蟋,那就是dispatch_barrier_async煌张,我們只要按照前面所述的順序?qū)⑷蝿?wù)分配到隊(duì)列就OK,剩下的都不用管了退客。dispatch_barrier_async的參數(shù)跟dispatch_async一模一樣的骏融。
下面開始講正題
總結(jié)前面所說,dispatch_barrier_async是會(huì)等待前面提到的任務(wù)0結(jié)束的萌狂,注意這里是async档玻。說到等待大家必然會(huì)想到dispatch_sync,dispatch_sync的任務(wù)是串行的茫藏,會(huì)等待任務(wù)結(jié)束程序再繼續(xù)往下走误趴。那dispatch_barrier是否存在一個(gè)sync的方法呢?存在……那么問題來了……那dispatch_barrier_async和dispatch_barrier_sync的區(qū)別在哪呢务傲?如果沒有區(qū)別的話蘋果何必搞出2個(gè)函數(shù)呢凉当,區(qū)別必然是有的。
先貼上代碼售葡,代碼非常簡(jiǎn)單看杭,就是按照之前提的需求寫的。
barrier里給了一個(gè)比較費(fèi)時(shí)的操作便于看清楚
給的圖里寫的是dispatch_barrier_sync挟伙,因?yàn)槲覀冃枰瓤纯次覀兪煜さ牡却猻ync是什么效果楼雹,直接跑起來
可以看到,確實(shí)是1像寒、2烘豹、3號(hào)任務(wù)并發(fā)執(zhí)行完了瓜贾,然后再執(zhí)行的我們的0號(hào)任務(wù)诺祸,再并發(fā)執(zhí)行的4、5祭芦、6號(hào)任務(wù)筷笨,當(dāng)然,point3和barrier之間是有明顯停頓的,截圖無法表現(xiàn)胃夏。對(duì)于這個(gè)輸出轴或,應(yīng)該是意料之中的。截下來仰禀,我們來看看async的效果
代碼進(jìn)行一點(diǎn)點(diǎn)修改照雁,dispatch_barrier_sync改成dispatch_barrier_async。我這里先把a(bǔ)aa答恶、bbb的輸出隱藏掉饺蚊。改完代碼可以直接跑起來,我們一起看看結(jié)果
好像除了aaa悬嗓、bbb之外其它的都跟上面sync的情況一模一樣(當(dāng)然污呼,并發(fā)的順序無法控制),而且point3和barrier之間同樣有明顯停頓,看來包竹,這個(gè)dispatch_barrier_async確實(shí)會(huì)等待它的任務(wù)0執(zhí)行完燕酷。
既然這樣那dispatch_barrier_async和dispatch_barrier_sync究竟有什么區(qū)別呢?我們把a(bǔ)aa周瞎、bbb的輸出打開看看就知道了苗缩。
區(qū)別很明顯,跟sync的情況相比声诸,aaa挤渐、bbb的輸出位置完全不同,async的時(shí)候aaa的輸出在任務(wù)0結(jié)束之前双絮,sync的aaa輸出在任務(wù)0結(jié)束之后浴麻。
好了,說到這應(yīng)該差不多能想通了囤攀,我們開始總結(jié)
dispatch_barrier_sync和dispatch_barrier_async的共同點(diǎn):
1软免、都會(huì)等待在它前面插入隊(duì)列的任務(wù)(1、2焚挠、3)先執(zhí)行完
2膏萧、都會(huì)等待他們自己的任務(wù)(0)執(zhí)行完再執(zhí)行后面的任務(wù)(4、5蝌衔、6)
dispatch_barrier_sync和dispatch_barrier_async的不共同點(diǎn):
在將任務(wù)插入到queue的時(shí)候榛泛,dispatch_barrier_sync需要等待自己的任務(wù)(0)結(jié)束之后才會(huì)繼續(xù)程序,然后插入被寫在它后面的任務(wù)(4噩斟、5曹锨、6),然后執(zhí)行后面的任務(wù)
而dispatch_barrier_async將自己的任務(wù)(0)插入到queue之后剃允,不會(huì)等待自己的任務(wù)結(jié)束沛简,它會(huì)繼續(xù)把后面的任務(wù)(4齐鲤、5、6)插入到queue
所以椒楣,dispatch_barrier_async的不等待(異步)特性體現(xiàn)在將任務(wù)插入隊(duì)列的過程给郊,它的等待特性體現(xiàn)在任務(wù)真正執(zhí)行的過程。