iOS 異步請求的簡單處理

舉例:比如A、B兩個請求,B必須等待A完成才執(zhí)行波岛。像這種情況的話很多人都在A請求完成的回調(diào)里面寫,這樣是可以的音半,但是要實現(xiàn)同步的話還有兩種方法则拷,一個是 GCD 里面的 barrier 函數(shù),另外一個是 GCD 里面信號量的方式曹鸠,我覺得信號量的方式是更靈活的處理煌茬,代碼入下:

 dispatch_semaphore_t semap = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [AFNetworking requestWithURLString:BASEURLWITH(@"login") 
                                parameters:@{@"email":@"fucc@gmail.com",
                                           @"password":@"xxxxxxx"} 
                                      type:HttpRequestTypePost 
                                   success:^(id responseObject) {
                                    NSLog(@"a完成");
                                   dispatch_semaphore_signal(semap);
                                 } failure:^(NSError *error) {
                                  NSLog(@"a完成,但是失敗了");
                                   dispatch_semaphore_signal(semap); 
        }];
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //等待信號30s彻桃,如果超過30s的話坛善,則進入 if 方法,否則就進入 else 方法
        //超時返回1
        if (dispatch_semaphore_wait(semap, dispatch_time(DISPATCH_TIME_NOW, 
                                   30 * NSEC_PER_SEC))) 
        {
            //處理超時
            //也可以把超時時間設置成forever,會一直等待直到收到信號
        }
        //不超時返回0
        else {
                [AFNetworking requestWithURLString:BASEURLWITH(@"login") 
                                    parameters:@{@"email":@"fucc@gmail.com",
                                                 @"password":@"xxxxxxx"} 
                                          type:HttpRequestTypePost 
                                       success:^(id responseObject) {
                                      NSLog(@"b完成");
                                     } failure:^(NSError *error) {
                                     NSLog(@"b完成邻眷,但是失敗了"); 
                }];
             }
   });

舉例:A眠屎、B、C三個請求肆饶,ABC都完成改衩,并且成功再執(zhí)行下一個動作。
錯誤示范:int i = 0驯镊,A 完成 i++,B 完成 i++, C完成 i++,然后在A葫督、B、C三個請求的成功回調(diào)里板惑,都進行判斷 i==3橄镜,這樣會出錯的原因是,3個請求同時完成的話冯乘,i = 1蛉鹿。
正確示范代碼入下:

    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_enter(dispatchGroup);
    NSLog(@"1");
    [AFNetworking requestWithURLString:BASEURLWITH(@"login1") 
                         parameters:@{@"email":@"fucc1@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"1完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
   dispatch_group_enter(dispatchGroup);
   NSLog(@"2");
   [AFNetworking requestWithURLString:BASEURLWITH(@"login2") 
                         parameters:@{@"email":@"fucc2@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"2完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
   dispatch_group_enter(dispatchGroup);
   NSLog(@"3");
   [AFNetworking requestWithURLString:BASEURLWITH(@"login3") 
                         parameters:@{@"email":@"fucc3@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"3完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"3個請求完成");
    });
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市往湿,隨后出現(xiàn)的幾起案子妖异,更是在濱河造成了極大的恐慌,老刑警劉巖领追,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件他膳,死亡現(xiàn)場離奇詭異,居然都是意外死亡绒窑,警方通過查閱死者的電腦和手機棕孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來些膨,“玉大人蟀俊,你說我怎么就攤上這事《┪恚” “怎么了肢预?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洼哎。 經(jīng)常有香客問我烫映,道長,這世上最難降的妖魔是什么噩峦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任锭沟,我火速辦了婚禮,結果婚禮上识补,老公的妹妹穿的比我還像新娘族淮。我一直安慰自己,他們只是感情好凭涂,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布祝辣。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪环凿。 梳的紋絲不亂的頭發(fā)上妻味,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音乍炉,去河邊找鬼。 笑死滤馍,一個胖子當著我的面吹牛岛琼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巢株,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼槐瑞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阁苞?” 一聲冷哼從身側響起困檩,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤祠挫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悼沿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體等舔,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年糟趾,在試婚紗的時候發(fā)現(xiàn)自己被綠了慌植。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡义郑,死狀恐怖蝶柿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情非驮,我是刑警寧澤交汤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站院尔,受9級特大地震影響蜻展,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邀摆,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一纵顾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栋盹,春花似錦施逾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榨汤,卻和暖如春蠕搜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收壕。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工妓灌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜜宪。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓虫埂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親圃验。 傳聞我的和親對象是個殘疾皇子掉伏,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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