標籤:style blog color os 使用 io strong 檔案 for
一、延時執行1、iOS常見的延時執行有2種方式
(1)調用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];// 2秒後再調用self的run方法
(2)使用GCD函數
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 2秒後非同步執行這裡的代碼...});
注意:這裡非同步執行的代碼,是放在主隊列中執行的
2、GCD延時執行
(1)主隊列執行
1 NSLog(@"延時開始前....");2 // 輸入dispatch_after3 // 從目前時間,延遲2.0秒之後,給主隊列添加一個任務(此任務會在主線程上【非同步】運行)4 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{5 NSLog(@"%@", [NSThread currentThread]);6 });7 NSLog(@"延時設定結束....");
輸出結果:
延時開始前....
延時設定結束....
<NSThread: 0x8d53ea0>{name = (null), num = 1}
從結果看出,延時操作是在主隊列非同步啟動並執行,因為 dispatch_after 裡邊有個 dispatch_get_main_queue參數
(2)非同步任務,開啟子線程執行延時
1 // 1. 隊列 2 dispatch_queue_t q = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); 3 4 // 2. 非同步任務 5 dispatch_async(q, ^{ 6 NSLog(@"延時開始前.... %@", [NSThread currentThread]); 7 // 輸入dispatch_after 8 // 從目前時間,延遲2.0秒之後,給主隊列添加一個任務(此任務會在主線程上【非同步】運行) 9 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{10 NSLog(@"%@", [NSThread currentThread]);11 });12 NSLog(@"延時設定結束....");13 });
輸出結果:
延時開始前.... <NSThread: 0x8c3f870>{name = (null), num = 2}
延時設定結束....
<NSThread: 0x8c23a80>{name = (null), num = 1}
結果說明,延時操作回到了主線程執行
(3)延時操作預設在主隊列執行的優點:
調用的方法通常是跟UI有關的,例如提示使用者等;
不瞭解GCD或者多線程的人,可以直接填空即可。
(4)dispatch_after 延時操作應用情境
例如:遊戲後台需要做一些隨機的事件,需要在某個時間後,調用方法。
一會兒冒個花,冒個什麼的,無意間做了什麼操作之後
二、隊列組 (1)有這麼1種需求 首先:分別非同步執行2個耗時的操作 其次:等2個非同步作業都執行完畢後,再回到主線程執行操作 如果想要快速高效地實現上述需求,可以考慮用隊列組
dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行1個耗時的非同步作業});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行1個耗時的非同步作業});dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 等前面的非同步作業都執行完畢後,回到主線程...});
(2)現執行個體子
類比下載txt檔案
iOS中多線程_06_GCD其它用法