iOS dispatch_semaphore(信號量)解決異步block問題所禀,死鎖問題

最近做一個直播項目的時候遇到顯示禮物后隱藏時的bug界斜。之前的邏輯是禮物在面板停留5秒后隱藏,但是隱藏有一個1秒的動畫眯搭,我的所有移除數(shù)據(jù)的邏輯都是在animation的complete里面窥翩,如果在這1秒中再次連擊禮物會出現(xiàn)數(shù)據(jù)錯誤的情況。為了不改變太多現(xiàn)有的邏輯鳞仙,我使用了dispatch_semaphore來解決這個問題寇蚊。

一、關(guān)于dispatch_semaphore

dispatch_semaphore主要使用下面三個方法來完成對線程的控制

//創(chuàng)建信號量棍好,參數(shù):信號量的初值仗岸,如果小于0則會返回NULL
dispatch_semaphore_create(信號量值)
 
//信號量值-1,如果信號量的值不大于0允耿,wait方法會阻塞線程
dispatch_semaphore_wait(信號量,等待時間)
 
//信號量值+1
dispatch_semaphore_signal(信號量)

dispatch_semaphore的其他介紹網(wǎng)上太多了扒怖,也介紹的非常詳細较锡,這里就不再贅述了。比如點擊這里有關(guān)于dispatch_semaphore的介紹

二盗痒、案例

A.m
- (void)doSomeAnimation{
   //禮物顯示時長+5s蚂蕴,執(zhí)行某些邏輯
  ......
  ......
  b.removeBlock=^{
    //移除數(shù)據(jù),移除視圖
  }
}
B.m
- (void)removeView{
  [UIView animateWithDuration:1.0 animations:^{
      
    } completion:^(BOOL finished) {
    if(self.removeBlock){
      self.removeBlock();
    }      
  }];
  
}

可以很明顯的看出俯邓,按照現(xiàn)有的邏輯骡楼,在移除動畫執(zhí)行的1秒內(nèi),如果doSomeAnimation方法被調(diào)用稽鞭,當(dāng)移除動畫執(zhí)行完畢后鸟整,禮物的view就會被移除。那么就需要川慌,在移除動畫執(zhí)行時吃嘿,doSomeAnimation這個方法的調(diào)用進入等待隊列。

使用dispatch_semaphore來解決這個問題

A.m
- (void)doSomeAnimation{
  //使用wait方法梦重,使信號量-1兑燥,如果當(dāng)前信號量不大于0,會阻塞當(dāng)前縣城
  dispatch_semaphore_wait(b.sem, DISPATCH_TIME_FOREVER);
  //禮物顯示時長+5s琴拧,執(zhí)行某些邏輯
  ......
  ......
  b.removeBlock=^{
    //動畫執(zhí)行完成降瞳,信號量+1
    dispatch_semaphore_signal(b.sem);
    //移除數(shù)據(jù),移除視圖
  }
  //使用signal使信號量+1
  dispatch_semaphore_signal(b.sem);
}
B.m
- (void)viewDidLoad{
  //創(chuàng)建
  self.sem = dispatch_semaphore_create(1);
 }
- (void)removeView{
  //開始執(zhí)行動畫蚓胸,信號量-1
  dispatch_semaphore_wait(self.sem, DISPATCH_TIME_FOREVER);
  [UIView animateWithDuration:1.0 animations:^{
      
    } completion:^(BOOL finished) {
    if(self.removeBlock){
      self.removeBlock();
    }      
  }];
  
}

梳理一下現(xiàn)在的邏輯挣饥,當(dāng)移除動畫開始執(zhí)行時,信號量-1沛膳,那么doSomeAnimation會被堵塞扔枫,當(dāng)執(zhí)行完畢后,信號量+1锹安,doSomeAnimation恢復(fù)正常執(zhí)行短荐。看上去沒什么毛病叹哭,但是現(xiàn)在還有很大的問題忍宋。

當(dāng)連續(xù)調(diào)用兩次wait,把當(dāng)前縣城阻塞之后风罩,removeBlock也會被阻塞糠排,那么就不能執(zhí)行dispatch_semaphore_signal使信號量+1,當(dāng)前線程就相當(dāng)于進入了死鎖狀態(tài)超升。

提供一下解決思路

解決思路入宦,把doSomeAnimation放在子線程中執(zhí)行哺徊,removeBlock放在主線程執(zhí)行,那么在執(zhí)行wait的時候云石,都在子線程中唉工,即使阻塞也只是子線程被阻塞了,當(dāng)移除動畫完成后汹忠,removeBlock在主線程中調(diào)用不會被阻塞dispatch_semaphore_signal方法就會被正常調(diào)用了淋硝。

相信自己能解決的

具體如何改就自己去操作吧,相信你在解決完這個問題后宽菜,對于dispatch_semaphore和死鎖都會有更深的理解了谣膳!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铅乡,隨后出現(xiàn)的幾起案子继谚,更是在濱河造成了極大的恐慌,老刑警劉巖阵幸,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花履,死亡現(xiàn)場離奇詭異,居然都是意外死亡挚赊,警方通過查閱死者的電腦和手機诡壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠割,“玉大人妹卿,你說我怎么就攤上這事∶镳校” “怎么了夺克?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚎朽。 經(jīng)常有香客問我铺纽,道長,這世上最難降的妖魔是什么哟忍? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任室囊,我火速辦了婚禮,結(jié)果婚禮上魁索,老公的妹妹穿的比我還像新娘。我一直安慰自己盼铁,他們只是感情好粗蔚,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饶火,像睡著了一般鹏控。 火紅的嫁衣襯著肌膚如雪致扯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天当辐,我揣著相機與錄音抖僵,去河邊找鬼。 笑死缘揪,一個胖子當(dāng)著我的面吹牛耍群,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播找筝,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蹈垢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袖裕?” 一聲冷哼從身側(cè)響起曹抬,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎急鳄,沒想到半個月后谤民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡疾宏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年张足,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾锯。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡兢榨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顺饮,到底是詐尸還是另有隱情吵聪,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布兼雄,位于F島的核電站吟逝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赦肋。R本人自食惡果不足惜块攒,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一汁讼、第九天 我趴在偏房一處隱蔽的房頂上張望裂明。 院中可真熱鬧解滓,春花似錦癣防、人聲如沸唱较。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗疟。三九已至,卻和暖如春住练,著一層夾襖步出監(jiān)牢的瞬間地啰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工讲逛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏吝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓盏混,卻偏偏與公主長得像蔚鸥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子括饶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容