ios GCD 多網(wǎng)絡請求成功 后刷新頁面,與AFNetworking 混用

1.開胃小菜

怎么用GCD 下載圖片呢? ,并且下載的時候顯示loading ,這就要異步下載,且不阻塞主線程。

    // 開啟一個線程進行數(shù)據(jù)請求
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSURL *url1 = [NSURL URLWithString:@"http://pic.qiantucdn.com/58pic/18/32/08/32658PICPUs_1024.png"];
        
        NSError *error;
        
        NSData *data = [NSData dataWithContentsOfURL:url1];
        
        if (data != nil) {
            
            // 在主線程中完成UI操作
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                [self.indicator stopAnimating];
                
                self.indicator.hidden = YES;
                
                UIImage *image = [UIImage imageWithData:data];
                
                self.imgV.image = image;
                
            });
            
        }else {
            
            NSLog(@"error whin download:%@",error);
            
        }
        
    });
2. GCD 多個網(wǎng)絡請求

在開發(fā)中經(jīng)常遇到 ,一個頁面有多個網(wǎng)絡請求,要在多個網(wǎng)絡請求之后再刷新UI,這個問題該怎么解決呢。

方法一 : 用CGD Group 實現(xiàn),請看代碼。

self 循環(huán)引用 請忽略,不是本文章的重點。

-(void)requestAll_GCDGroup{
// 方法一: GCD的leave和enter    我們利用dispatch_group_t創(chuàng)建隊列組,手動管理group關(guān)聯(lián)的block運行狀態(tài),進入和退出group的次數(shù)必須匹配。
    //1.創(chuàng)建隊列組
    dispatch_group_t group = dispatch_group_create();
    //2.創(chuàng)建隊列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //3.添加請求
    dispatch_group_async(group, queue, ^{
        dispatch_group_enter(group);
        [self requestTopWithSuccessCallBack:^(NSArray *array) {
            self.topArr = array;
            dispatch_group_leave(group);
        } failCallback:^(bool isFail) {
            dispatch_group_leave(group);
        }];

    });
    dispatch_group_async(group, queue, ^{
        dispatch_group_enter(group);
        [self requestShehuiWithSuccessCallBack:^(NSArray *array) {
            self.shehuiArr = array;
            dispatch_group_leave(group);
        } failCallback:^(bool isFail) {
            dispatch_group_leave(group);
        }];
     
    });
    
    dispatch_group_async(group, queue, ^{
        dispatch_group_enter(group);
        [self requestGuoneiWithSuccessCallBack:^(NSArray *array) {
            self.guoneiArr = array;
            dispatch_group_leave(group);
        } failCallback:^(bool isFail) {
            dispatch_group_leave(group);
        }];
        
    });
    
    //4.隊列組所有請求完成回調(diào)刷新UI
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//        NSLog(@"model:%f",_buyingStrategyModel.leverrisk);
        NSLog(@"加載完成");
        [self.mainTable.mj_header endRefreshing];
        [self.mainTable reloadData];
    });
}

方法二: GCD的信號量dispatch_semaphore_t

這種方式有點類似于通知模式,是利用監(jiān)聽信號量來發(fā)送消息以達到并發(fā)處理的效果,我們來看看代碼:

//方法 二:
-(void)requestAll_GCDSemaphore{
    //創(chuàng)建信號量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        //1
        [self requestTopWithSuccessCallBack:^(NSArray *array) {
            self.topArr = array;
            dispatch_semaphore_signal(semaphore);
        } failCallback:^(bool isFail) {
             dispatch_semaphore_signal(semaphore);
        }];
  
    });
    dispatch_group_async(group, queue, ^{
        //2
        [self requestShehuiWithSuccessCallBack:^(NSArray *array) {
            self.shehuiArr = array;
            dispatch_semaphore_signal(semaphore);
        } failCallback:^(bool isFail) {
            dispatch_semaphore_signal(semaphore);
        }];

    });
    
    dispatch_group_async(group, queue, ^{
        //3
        [self requestGuoneiWithSuccessCallBack:^(NSArray *array) {
            self.guoneiArr = array;
            dispatch_semaphore_signal(semaphore);
        } failCallback:^(bool isFail) {
            dispatch_semaphore_signal(semaphore);
        }];
        
    });
    
    dispatch_group_notify(group, queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"信號量為0");
        dispatch_async(dispatch_get_main_queue(), ^{
            // 通知主線程刷新 神馬的
            [self.mainTable.mj_header endRefreshing];
            [self.mainTable reloadData];
        });
        
    });
}

參考 https://blog.csdn.net/pianzhidenanren/article/details/52571853

三.效果demo源碼

下面是demo 源碼地址,可以運行的項目。有需要的同學可以看下。

demo 效果圖:


image.png

內(nèi)頁-實現(xiàn)頁


image.png

頭條是一個網(wǎng)絡請求,
社會是一個網(wǎng)絡請求
國內(nèi)是一個網(wǎng)絡請求。 共三個請求。三個請求都結(jié)束的時候 ,結(jié)束下拉刷新。

參考:https://blog.csdn.net/lee_woxinyiran/article/details/80790578
demo地址 https://gitee.com/Sunny0123/GCDTest

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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