1. 程式人生 > >如何等到巢狀的block執行完後再執行其他程式碼?

如何等到巢狀的block執行完後再執行其他程式碼?

現在有一個單例 Manage.h、Manage.m  裡面有你封裝的一個請求伺服器資料的方法。

例如:-(void)manageRequestWithUrl:(NSURL*)urlName handleBlock(void(^)(NSData *data,NSError* error)) handle{

NSURLRequest *request=[NSURLRequestrequestWithURL:url];

NSURLSessionDataTask *dataTask=[[selfmySession] dataTaskWithRequest:request         completionHandler

:^(NSData * _Nullable data, NSURLResponse * _Nullable response,     NSError * _Nullable error) {

        handle(data,error);

    }];

    [dataTask resume];


}注意 這個封裝函式本身就是個block 而用nsurlsession  請求返回的資料也是block。

現在你要在 類A.m 裡 同時請求3個介面 然後把結果放到一個數組裡 並重新整理TableView;

A.m 裡 你可以用 單例 Manage.h 封裝好的放法 。如何使這三個請求並行執行 而且剛好是3個都請求完了以後才重新整理TableView 呢?

這時就要用到 強大的GCD了 。 利用group 和 queue 就能很好的解決這個問題。

A.m 裡 呼叫3個請求:

            1. 建立佇列,可以用全域性佇列 也可以 自己建立一個,自己建立的不會加入到全域性佇列中。

            2.建立組。

            3.dispatch_group_enter(mygroup); 

dispatch_async(myqueue, ^{執行的方法});                                              dispatch_group_leave(mygroup); 執行的方法完成以後 離開組。 最後執行

       dispatch_group_notify(mygroupdispatch_get_main_queue(), ^{});

myqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

mygroup = dispatch_group_create();

dispatch_group_enter(mygroup);

dispatch_async(myqueue, ^{

NSString *urlStr [email protected]“請求1”;

        [ManagerequestUrl:urlStr withData:^(NSData *data, NSError *error) {

if (!error) {

NSMutableDictionary *dataDic = [NSJSONSerializationJSONObjectWithData:data

options:NSJSONReadingMutableContainers

error:nil];

dispatch_group_leave(mygroup);

        }];

    });

dispatch_group_enter(mygroup);

dispatch_async(myqueue, ^{

NSString *urlStr [email protected]“請求2”;

        [ManagerequestUrl:urlStr withData:^(NSData *data, NSError *error) {

if (!error) {

NSMutableDictionary *dataDic = [NSJSONSerializationJSONObjectWithData:data

options:NSJSONReadingMutableContainers

error:nil];

dispatch_group_leave(mygroup);

        }];

    });

dispatch_group_enter(mygroup);

dispatch_async(myqueue, ^{

NSString *urlStr [email protected]“請求3”;

        [ManagerequestUrl:urlStr withData:^(NSData *data, NSError *error) {

if (!error) {

NSMutableDictionary *dataDic = [NSJSONSerializationJSONObjectWithData:data

options:NSJSONReadingMutableContainers

error:nil];

dispatch_group_leave(mygroup);

        }];

    });

最後執行!!!

dispatch_group_notify(mygroup, dispatch_get_main_queue(), ^{

        [_wTablereloadData];//重新整理

    });


這樣就能等到 3個請求都返回資料以後再重新整理 ,上面這種方法 屬於 手動管理gourp  還有一種是 交給系統來管理: 例如:

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_group_t group1 = dispatch_group_create();

dispatch_group_async(group1, queue, ^{

NSLog(@"A買水果");

    });

dispatch_group_async(group1, queue, ^{

NSLog(@"B買烤鴨");

    });

dispatch_group_async(group1, queue, ^{

NSLog(@"C買撲克");

    });

dispatch_group_async(group1, queue, ^{

NSLog(@"D買水");

    });

dispatch_group_notify(group1, queue, ^{

NSLog(@"Let's go!");

    });



相關推薦

如何等到block執行執行其他程式碼

現在有一個單例 Manage.h、Manage.m  裡面有你封裝的一個請求伺服器資料的方法。 例如:-(void)manageRequestWithUrl:(NSURL*)urlName handleBlock(void(^)(NSData *data,NSError*

java 主執行緒等待子執行執行執行

這裡記錄一下下面這種情況:主執行緒需要等待多個子執行緒執行完後再執行。 我們先看一下下面的場景: package com.java4all.mypoint; import java.util.concurrent.CountDownLatch; /*

iOS 多工全部執行執行操作 —— HERO部落格

介紹一下開發中遇到多個任務的情況及處理方法。1. 有兩個載入圖片的任務,全部載入完成後在進行相應操作,耗時操作不應該放在主執行緒,所以開啟子執行緒載入,通過佇列組實現:{ // 建立佇列組 dispatch_group_t group = dispatch_

執行執行時,如果一個邏輯需要若干個執行執行完成執行,怎麼實現?

實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&

ExecutorService的 isTerminated()實現子執行緒先執行推出主執行

/** * 先讓所有的子執行緒執行完,再執行主執行緒*/ public class Main { public static void main(String[] args) { ExecutorService executorService=Execut

執行緒Thread執行之後執行mian執行緒的UI更新等等

我想打一下1,2,3。然後我這麼寫System.out.println(1); Thread thread=new Thread(new Runnable() { public void r

C# 本程序執行完畢執行下一執行

  最近做了一套MES整合系統,由上料到成品使自動化執行,其中生產過程是逐步的,但是每一個動作都需要獨立的執行緒進行資料監聽,那麼就需要實現執行緒等待。 程式碼: using System; using System.Collections.Generic; using System.Compone

C# 本進程執行完畢執行下一線程

pda lag initial process orm threading 監聽 message tasks   最近做了一套MES集成系統,由上料到成品使自動化運行,其中生產過程是逐步的,但是每一個動作都需要獨立的線程進行數據監聽,那麽就需要實現線程等待。 代碼: us

java如何在多執行執行完成執行某個方法

package com.whj.feign.client; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concur

java開啟多個執行緒,執行完成執行執行

博主昨天去一家公司面試,被面試官問到一個問題,如果開啟10個執行緒,但是需要這10個執行緒都執行完成後,再交由主執行緒統一輸入,如何實現?當時我沒有回答,我對多執行緒並不是那麼的熟悉,面試結束後,我通過查閱資料找到了解決方案,下面我貼出程式碼: i

迴圈裡面一個非同步請求,所有迴圈執行完畢返回請求的資料

場景介紹: 使用es6實現爬蟲,先遍歷完列表,然後迴圈列表的根據url去查詢每篇文章的詳細內容,最後將所有爬取完的資料寫入資料庫(只寫一次,避免資料庫頻繁的開啟的關閉,影響效能)。 原始實現方式和痛點分析: var list =["url1","url2","url3",.

javascript 如何執行一個函式執行下一個函式

先說結論: 首先,JavaScript是解釋性語言,本來就是順序執行的!! 所以,如果發現有一段js程式碼總是在一段程式碼之前就執行完了,比如說報了null異常,那麼有可能是回撥函式的非同步機制造成的。 此種情形下解決的方法是,把要執行的函式放在回撥函式內部就可以了。 舉個栗子

quartz在job間隔期間內,保證上一個任務執行執行下一個任務

假設,我們有個job,每2分鐘執行一次,但是job本身就要執行5分鐘,這個時候,quartz預設設定是併發的,所以它又會開一個執行緒來執行。這樣往往會導致我們執行的資料不正確。 解決辦法: 1、要是是和spring框架結合的,可以新增如下配置: <

當ScrowViewlistView載入資料列表自動滾動到最頂端的問題

當ScrowView巢狀listView時,而且在listview上端還有內容的時候,導致listview載入完資料後,自動滾動到最頂端的問題,以下是解決方案,即在外層再加一個LinearLayout ,就能解決,以下是例項 <LinearLayou

bat中如何某個程式啟動執行其他程式

大概思路 每個5秒鐘去查詢程序中是否存在某程序,存在則執行其他程式,否則等待 具體程式碼可參照: set status=false :TaskXXX for /f "delims= " %%i in ('tasklist') do ( if "%%i"=="TaskXXX

線程池: 等待線程池內所有線程執行完畢繼續任務

繼續 con col await mina cut bsp src code boolean loop = true; do{ loop=!executorService.awaitTermination(2, TimeUnit.SECONDS); }while(

iOS應用打包在開發者網站新增應用測試ID能夠加入測試嗎

1、明確指出 不行: 1、打包測試包前一定要先新增測試裝置的UDID 2、新增測試的裝置UDID一定要先於打包測試包,否則裝置無法參加測試 3、使用蒲公英分享測試包,檢視可參加測試的裝置UDID 2、上傳與檢視步驟 2.1 上傳 登

iOS開發-多層block中如何使用__weak和__strong

1、關於__weak __weak只能在ARC模式下使用,也只能修飾物件(比如NSString等),不能修飾基本資料型別(比如int等) __weak修飾的物件在block中不可以被重新賦值。 __weak只在ARC下使用,可以避免迴圈引用。 __weak修飾物

CallableAndFuture 返回執行執行的結果

package cn.itcast.heima2; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.

現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1執行執行,T3在T2執行執行

這是個基礎的執行緒問題,主要是考核join方法的。不瞭解這個方法的話會感覺很懵逼。 假設現在有兩個執行緒A、B。如果在A的run方法中呼叫B.join(),表示A需要在B執行緒上面等待,也就是需要在B執行緒執行完成之後才能再次執行。瞭解這個概念之後,這個問題就很簡單了,java程式碼如下: