1:GCD?
創建隊列:
串行隊列:
dispatch_queue_t? queue=dispatch_queue_creat(@"lac.jianshu.weibo",DISPATCH_QUEUE_SERIAL);
GCD提供兩種Dispatch Queue, 分別為Concurrent Dispatch Queue 和 Serial Dispatch Queue.
Serial Dispatch Queue 使用一個thread,默認為nil。
Concurrent Dispatch Queue 使用多個thread。
如果是對數據庫表更新或更新文件,最好為每一個表或文件建立一個Serial Dispatch Queue,這樣能保證只有一個thread會對數據進行更新。
如果對那些不會引起數據不一致問題的任務,需要放到Concurrent Dispatch Queue執行。
dispatch_sync(queue, ^{});
全局隊列:
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_gloabal_queue 的第一個參數為枚舉類型(默認為0),決定任務的優先級 ,第二個參數為Apple保留參數,傳0
#define DISPATCH_QUEUE_PRIORITY_HIGH? ? ? ? 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT? ? 0
#define DISPATCH_QUEUE_PRIORITY_LOW? ? ? ? (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND? INT16_MIN(后臺任務,優先級最低)
主隊列 :dispatch_queue_t main_queue=dispatch_get_main_queue();
延時3秒加載:dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(),^{
NSLog(@"after 3 seconds...");});
dispatch_set_target_queue: 主要用來給新建的queue設置優先級
dispatch_set_target_queue(queue1,系統queue2);
第一個參數是自定義的queue1,而不是系統的queue。因為你不能給系統的queue設置權限。通過上面設置,queue1 就有了與系統queue2一樣的優先級。其實這個函數不僅可以設置queue的優先級,還可以設置queue之間的層級結構。
dispatch_group_notify 可以在group中的dispatch queue都執行完之后,通過一個dispatch_group_notify通知回調
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, ^{NSLog(@"task1");});
dispatch_group_async(group, queue, ^{NSLog(@"task2");});
dispatch_group_async(group, queue, ^{NSLog(@"task3");});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"finished...");});
dispatch_barrier_async
dispatch_barrier_async是一個可以讓當前任務等待queue其他任務完成再執行的函數。例如,從數據庫讀取數據是可以多線程并發讀取的,因為這樣提高效率。但是,更新數據庫數據,就要保證只有一個線程進行更新操作。所以,當更新操作發生的時候,一定要保證讀操作和其他更新操作等待。
dispatch_onece 保證了dispatch_once中的代碼只會被執行一次,常用于單例。
dispatch semaphore 是一個信號量的counter,當counter為0,當前線程停止運行,當大于0,自減1,繼續執行。
dispatch_semaphore_wait? dispatch_semaphore_signal
dispatch_semaphore_signal?
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);所以在下面的代碼中,就可以保證在wait和signal中的[array addObject:[NSNumber numberWithInt:i]]; 就只有一個thread進行操作,保證了線程安全
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 100000; i++)
{
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[array addObject:[NSNumber numberWithInt:i]];
dispatch_semaphore_signal(semaphore);
});
}
dispatch_apply
dispatch_apply用于給一個block添加到dispatch queue若干次。 “for”循環
dispatch_suspend/dispatch_resume
用于暫停和繼續執行queue