iOS隨筆——多個網(wǎng)絡請求場景

在開發(fā)中對于多個網(wǎng)絡請求下的數(shù)據(jù)處理屯阀,一般會碰到以下兩種需求:

  1. A網(wǎng)絡請求完成救欧,再進行B網(wǎng)絡請求值戳,最后數(shù)據(jù)處理
  2. A網(wǎng)絡請求與B網(wǎng)絡請求完成之后,最后數(shù)據(jù)處理
第一種場景:

場景例子: A網(wǎng)絡請求獲取臨時token愈腾,用于B網(wǎng)絡請求的參數(shù)
處理方式:

- (void)sceneOneTest {
    [[NetworkEngine shareEngine] fetch... completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
        if (isSucceeded) {
            // 獲取token
            NSString *tempToken = ...;
            [[NetworkEngine shareEngine] fetch... requestParamter:@{@"token": tempToken} completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
                // Todo
            }];
        } else {
            // 異常處理
        }
    }];
}

注意點:

  • 異常處理
  • 多個網(wǎng)絡請求時候封裝
  • 循環(huán)引用
第二種場景:

場景例子:A網(wǎng)絡請求 和 B網(wǎng)絡請求完成后憋活,刷新界面(一般用于數(shù)據(jù)量大業(yè)務區(qū)分明顯的頁面)
處理方法A:使用一個計數(shù)變量,來統(tǒng)計網(wǎng)絡請求的完成數(shù)量

static char *blockKey;
- (void)sceneTwoTestA {
    __block NSInteger networkFinishNum = 0;
    [[NetworkEngine shareEngine] fetch... completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
        if (isSucceeded) {
            // Todo
            void(^block)() = objc_getAssociatedObject(self, blockKey);
            if (block) {
                block();
            }
        } else {
            // 異常處理
        }
    }];
    
    [[NetworkEngine shareEngine] fetch... completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
        if (isSucceeded) {
            // Todo
            void(^block)() = objc_getAssociatedObject(self, blockKey);
            if (block) {
                block();
            }
        } else {
            // 異常處理
        }
    }];
    
    void(^completionBlock)() = ^{
        networkFinishNum ++;
        if (networkFinishNum == 2) {
            // 刷新界面
        }
    };
    objc_setAssociatedObject(self, blockKey, completionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

處理方法B:通過GCD的信號量虱黄,完成場景需求

- (void)sceneTwoTestB {
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    // 執(zhí)行循序1
    dispatch_group_async(group, queue, ^{
        [[NetworkEngine shareEngine] fetch... completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
            if (isSucceeded) {
                // Todo
            } else {
                // 異常處理
            }
             // 執(zhí)行順序4/6
            dispatch_semaphore_signal(semaphore);
        }];
    });
    // 執(zhí)行循序2
    dispatch_group_async(group, queue, ^{
        [[NetworkEngine shareEngine] fetch... completionBlock:^(BOOL isSucceeded, id responseObject, NSError *error) {
            if (isSucceeded) {
                // Todo
            } else {
                // 異常處理
            }
            // 執(zhí)行順序4/6
            dispatch_semaphore_signal(semaphore);
        }];
    });
    
    dispatch_group_notify(group, queue, ^{
         // 執(zhí)行循序3
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
         // 執(zhí)行順序5 
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
         // 執(zhí)行順序7 
        dispatch_async(dispatch_get_main_queue(), ^{
            // 刷新界面
        });
    });
}

簡單的介紹一下關于信號量的三個方法:
信號量可以用車庫中的空閑車位來表示悦即,當往車庫停車時候,如果車庫已滿橱乱,則需等待(阻塞線程)
1.創(chuàng)建一個車庫辜梳,value表示車庫中空閑車位的數(shù)量

dispatch_semaphore_create(long value);

2.往車庫里面停一輛車,如果沒有空車位泳叠,則一直會等待在車庫外作瞄,等待時間為dispatch_time_t timeout,如果有空車位則停車危纫,減少一個空車位

dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);

3.從車庫中開走一輛車,增加一個空閑車位

dispatch_semaphore_signal(dispatch_semaphore_t dsema);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宗挥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子种蝶,更是在濱河造成了極大的恐慌契耿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螃征,死亡現(xiàn)場離奇詭異搪桂,居然都是意外死亡,警方通過查閱死者的電腦和手機会傲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拙泽,“玉大人淌山,你說我怎么就攤上這事」苏埃” “怎么了泼疑?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荷荤。 經(jīng)常有香客問我退渗,道長,這世上最難降的妖魔是什么蕴纳? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任会油,我火速辦了婚禮,結果婚禮上古毛,老公的妹妹穿的比我還像新娘翻翩。我一直安慰自己都许,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布嫂冻。 她就那樣靜靜地躺著胶征,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨仿。 梳的紋絲不亂的頭發(fā)上睛低,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音服傍,去河邊找鬼钱雷。 笑死,一個胖子當著我的面吹牛伴嗡,可吹牛的內(nèi)容都是我干的急波。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘪校,長吁一口氣:“原來是場噩夢啊……” “哼澄暮!你這毒婦竟也來了?” 一聲冷哼從身側響起阱扬,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泣懊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麻惶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馍刮,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年窃蹋,在試婚紗的時候發(fā)現(xiàn)自己被綠了卡啰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡警没,死狀恐怖匈辱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杀迹,我是刑警寧澤亡脸,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站树酪,受9級特大地震影響浅碾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜续语,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一垂谢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疮茄,春花似錦埂陆、人聲如沸苛白。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽购裙。三九已至,卻和暖如春鹃栽,著一層夾襖步出監(jiān)牢的瞬間躏率,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工民鼓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薇芝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓丰嘉,卻偏偏與公主長得像夯到,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饮亏,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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

  • iOS網(wǎng)絡架構討論梳理整理中耍贾。。路幸。 其實如果沒有APIManager這一層是沒法使用delegate的荐开,畢竟多個單...
    yhtang閱讀 5,190評論 1 23
  • AFHTTPRequestOperationManager 網(wǎng)絡傳輸協(xié)議UDP、TCP简肴、Http晃听、Socket、X...
    Carden閱讀 4,337評論 0 12
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理砰识,服務發(fā)現(xiàn)能扒,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 某君辫狼,我學生初斑,在家鄉(xiāng)深山任教二十余年,被調(diào)到城里任官予借,卻厭煩城市的繁華嘈雜越平,欲請辭回山中王峰鄉(xiāng)任教频蛔。如今人心...
    老海李亞強閱讀 341評論 2 4
  • 人生中第一次戀愛灵迫,還在學習中
    兩點三橫閱讀 108評論 0 0