AFN回調(diào)執(zhí)行完成之后再執(zhí)行后面的代碼

使用信號(hào)量(dispatch_semaphore_t)來(lái)實(shí)現(xiàn),AFN回調(diào)執(zhí)行完成之后再執(zhí)行后面的代碼

什么是信號(hào)量?

  • 為了防止出現(xiàn)因多個(gè)程序同時(shí)訪問(wèn)一個(gè)共享資源而引發(fā)的一系列問(wèn)題,我們需要一種方法,它可以通過(guò)生成并使用令牌來(lái)授權(quán),在任一時(shí)刻只能有一個(gè)執(zhí)行線程訪問(wèn)代碼的臨界區(qū)域.臨界區(qū)域是指執(zhí)行數(shù)據(jù)更新的代碼需要獨(dú)占式地執(zhí)行.而信號(hào)量就可以提供這樣的一種訪問(wèn)機(jī)制,讓一個(gè)臨界區(qū)同一時(shí)間只有一個(gè)線程在訪問(wèn)它,也就是說(shuō)信號(hào)量是用來(lái)調(diào)協(xié)進(jìn)程對(duì)共享資源的訪問(wèn)的.
  • 信號(hào)量就是一個(gè)資源計(jì)數(shù)器,對(duì)信號(hào)量有兩個(gè)操作來(lái)達(dá)到互斥,分別是P和V操作.一般情況是這樣進(jìn)行臨界訪問(wèn)或互斥訪問(wèn)的:設(shè)信號(hào)量值為1,當(dāng)一個(gè)進(jìn)程1運(yùn)行是,使用資源,進(jìn)行P操作,即對(duì)信號(hào)量值減1,也就是資源數(shù)少了1個(gè).這是信號(hào)量值為0.系統(tǒng)中規(guī)定當(dāng)信號(hào)量值為0是,必須等待,知道信號(hào)量值不為零才能繼續(xù)操作.這時(shí)如果進(jìn)程2想要運(yùn)行,那么也必須進(jìn)行P操作,但是此時(shí)信號(hào)量為0,所以無(wú)法減1,即不能P操作,也就阻塞.這樣就到到了進(jìn)程1排他訪問(wèn).當(dāng)進(jìn)程1運(yùn)行結(jié)束后,釋放資源,進(jìn)行V操作.資源數(shù)重新加1,這是信號(hào)量的值變?yōu)?,這時(shí)進(jìn)程2發(fā)現(xiàn)資源數(shù)不為0,信號(hào)量能進(jìn)行P操作了,立即執(zhí)行P操作.信號(hào)量值又變?yōu)?,次數(shù)進(jìn)程2咱有資源,排他訪問(wèn)資源,這就是信號(hào)量來(lái)控制互斥的原理.
  • 在iOS開(kāi)發(fā)中,我們可以通過(guò)dispatch方法來(lái)設(shè)置信號(hào)量,實(shí)現(xiàn)某些需求.

在當(dāng)前項(xiàng)目中,我需要實(shí)現(xiàn)一個(gè)功能,那就是發(fā)送請(qǐng)求之前判斷token是否過(guò)期了,如果過(guò)期,那么需要刷新token,然后再發(fā)送請(qǐng)求.那么我必須保證發(fā)送請(qǐng)求之前,token必須刷新完成,即刷新token的請(qǐng)求的回調(diào)必須執(zhí)行完之后才能執(zhí)行發(fā)送請(qǐng)求的代碼.

//刷新token
- (void)reloadToken
{
    NSLog(@"1");
    NSLog(@"%@",[NSThread currentThread]);
    //先創(chuàng)建一個(gè)semaphore
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    //拼接路徑
    NSString *url=[NSString stringWithFormat:@"%@%@%@",BASE_URL,TOKEN_REFRESH_URL,[LTools cacheForKey:User_id]];
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //為請(qǐng)求的回調(diào)開(kāi)啟線程,不然會(huì)形成死鎖,代碼永遠(yuǎn)都不會(huì)執(zhí)行了
    manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //添加token到請(qǐng)求頭
    [manager.requestSerializer setValue:[LTools cacheForKey:TokenNew] forHTTPHeaderField:@"oldToken"];
    //發(fā)送請(qǐng)求
    [manager GET:url parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject)
     {
         //存儲(chǔ)新的token
         NSString *newToken = responseObject[@"data"][@"token"];
         [LTools cache:newToken ForKey:TokenNew];
         
         NSLog(@"3-1");
         NSLog(@"3-1%@",[NSThread currentThread]);
         //發(fā)出已完成的信號(hào)
         dispatch_semaphore_signal(semaphore);
     }
         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
     {
         //如果請(qǐng)求失敗,那么取消登錄狀態(tài),刪除個(gè)人數(shù)據(jù)
         [LTools storage:NO ForKey:LoginState];
         NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
         //刪除所有用戶數(shù)據(jù)
         [userDefaults removeObjectForKey:User_id];
         [userDefaults removeObjectForKey:User_headimg];
         [userDefaults removeObjectForKey:User_mobile];
         [userDefaults removeObjectForKey:User_nickName];
         [userDefaults removeObjectForKey:User_isPayPassword];
         [userDefaults removeObjectForKey:User_CarId];
         [userDefaults removeObjectForKey:User_CarLogo];
         [userDefaults removeObjectForKey:User_isWeChat];
         [userDefaults removeObjectForKey:User_isQQ];
         [userDefaults removeObjectForKey:TokenNew];
         [userDefaults removeObjectForKey:User_gender];
         [userDefaults removeObjectForKey:User_carBrand];
         [userDefaults removeObjectForKey:User_RecommendCode];
         
         NSLog(@"3-2");
         NSLog(@"3-2%@",[NSThread currentThread]);
         //發(fā)出已完成的信號(hào)
         dispatch_semaphore_signal(semaphore);
     }];
    
    NSLog(@"2");
    NSLog(@"%@",[NSThread currentThread]);
    //等待執(zhí)行趁怔,不會(huì)占用資源
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末配深,一起剝皮案震驚了整個(gè)濱河市甲棍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古沥,死亡現(xiàn)場(chǎng)離奇詭異瘸右,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岩齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)太颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盹沈,你說(shuō)我怎么就攤上這事龄章。” “怎么了乞封?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵做裙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肃晚,道長(zhǎng)锚贱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任关串,我火速辦了婚禮拧廊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悍缠。我一直安慰自己卦绣,他們只是感情好耐量,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布飞蚓。 她就那樣靜靜地躺著,像睡著了一般廊蜒。 火紅的嫁衣襯著肌膚如雪趴拧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天山叮,我揣著相機(jī)與錄音著榴,去河邊找鬼。 笑死屁倔,一個(gè)胖子當(dāng)著我的面吹牛脑又,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锐借,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼问麸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钞翔?” 一聲冷哼從身側(cè)響起严卖,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎布轿,沒(méi)想到半個(gè)月后哮笆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體来颤,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年稠肘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了福铅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡项阴,死狀恐怖本讥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲁冯,我是刑警寧澤拷沸,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站薯演,受9級(jí)特大地震影響撞芍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跨扮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一序无、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衡创,春花似錦帝嗡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至一也,卻和暖如春巢寡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椰苟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工抑月, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舆蝴。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓谦絮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洁仗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子层皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 一、 【例3-1-4】在操作系統(tǒng)中京痢,要對(duì)并發(fā)進(jìn)程進(jìn)行同步的原因是 奶甘。 A. 進(jìn)程必須在有限的時(shí)間內(nèi)完成 B. 進(jìn)程...
    ZoeyeoZ閱讀 4,950評(píng)論 0 9
  • ** 本文摘自湯小丹主編《計(jì)算機(jī)操作系統(tǒng)》(第三版)2.3 進(jìn)程同步 ** 在 OS 中引入進(jìn)程后,雖然提高了資源...
    劉帥_閱讀 3,091評(píng)論 0 0
  • 一只蚊子吻吻我的胳膊 胳膊便羞紅了臉頰 深夜里 這只蚊子便是我的摯友 它喝的我的血 那是一汪清泉 深夜仿佛一汪清泉...
    盧城閱讀 412評(píng)論 0 1
  • 引言:企業(yè)的目標(biāo)能否達(dá)到,取決于經(jīng)理人管理的好壞祭椰,也取決于如何管理經(jīng)理人臭家。員工的工作是否有成效疲陕,在很大程度上取決于...
    Mr阿文閱讀 1,588評(píng)論 0 1
  • 20170105 11:06 1.我怎么如此幸運(yùn),臘八節(jié)的點(diǎn)心钉赁,怎么那么意想不到順其自然不費(fèi)力氣的就有了蹄殃![呲牙...
    徐美娜閱讀 222評(píng)論 0 0