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

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

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

場景例子: A網(wǎng)絡(luò)請求獲取臨時token,用于B網(wǎng)絡(luò)請求的參數(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)絡(luò)請求時候封裝
  • 循環(huán)引用
第二種場景:

場景例子:A網(wǎng)絡(luò)請求 和 B網(wǎng)絡(luò)請求完成后,刷新界面(一般用于數(shù)據(jù)量大業(yè)務(wù)區(qū)分明顯的頁面)
處理方法A:使用一個計數(shù)變量,來統(tǒng)計網(wǎng)絡(luò)請求的完成數(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(), ^{
            // 刷新界面
        });
    });
}

簡單的介紹一下關(guān)于信號量的三個方法:
信號量可以用車庫中的空閑車位來表示,當(dāng)往車庫停車時候,如果車庫已滿,則需等待(阻塞線程)
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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,490評論 1 23
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http、Socket、X...
    Carden閱讀 5,320評論 0 12
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 某君,我學(xué)生,在家鄉(xiāng)深山任教二十余年,被調(diào)到城里任官,卻厭煩城市的繁華嘈雜,欲請辭回山中王峰鄉(xiāng)任教。如今人心...
    老海李亞強(qiáng)閱讀 427評論 2 4
  • 人生中第一次戀愛,還在學(xué)習(xí)中
    兩點三橫閱讀 129評論 0 0

友情鏈接更多精彩內(nèi)容