如何等到巢狀的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
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(mygroup, dispatch_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框架結合的,可以新增如下配置: <
當ScrowView巢狀listView載入完資料後列表自動滾動到最頂端的問題
當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程式碼如下: