swift 版本:http://www.lxweimin.com/p/6a8be281ddc8
一丶目錄
GCD (Grand Central Dispatch) 蘋果推薦使用的多線程技術
1.多個網絡請求并發處理
2.使用快速迭代
3.分線程,主線程通訊;
4.延遲執行;
5.一次性代碼,默認線程安全
6.隊列組的使用
7.dispatch_semaphore信號量的使用
二丶代碼:
1.多個網絡請求并發處理;
dispatch_group_t dispatchGroup = dispatch_group_create();
//發送第一個請求dispatch_group_enter(dispatchGroup);
{
//第一個請求回來
dispatch_group_leave(dispatchGroup);
}
//發送第二個請求
dispatch_group_enter(dispatchGroup);
{
//第二個請求回來 dispatch_group_leave(dispatchGroup);
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
//請求完成
});
2.快速迭代
//快速迭代10次;順序不定;線程不定
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index)
{
NSLog(@"dispatch_apply--%ld--%@",index,[NSThread currentThread]);
});
3.分線程/主線程通訊
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
//分線程->耗時的操作
dispatch_async(dispatch_get_main_queue(), ^{
//主線程
});
});
4.延遲執行
//延遲2秒
NSLog(@"run--time:%@",[NSDate date]);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"run--time:%@",[NSDate date]);
});
5.一次性代碼,默認線程安全不會出現多個線程同時訪問
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只執行一次---%@",[NSThread currentThread]);
});
NSLog(@"n次--%@",[NSThread currentThread]);
6.隊列組的使用
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 先執行3個耗時操作
dispatch_group_async(group, queue, ^{
for (int i = 0 ; i < 1000; i ++) {
NSLog(@"1--%@--",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for (int i = 0 ; i < 1000; i ++) {
NSLog(@"2--%@--",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for (int i = 0 ; i < 1000; i ++) {
NSLog(@"3--%@--",[NSThread currentThread]);
}
});
// 等到以上任務完成后才會執行這個notify任務
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"main--%@--",[NSThread currentThread]);
});
7.dispatch_semaphore信號量的使用
//輸出一個dispatch_semaphore_t類型且值為value的信號量;這里的傳入的參數value必須大于或等于0,否則dispatch_semaphore_create會返回NULL
dispatch_semaphore_t signal = dispatch_semaphore_create(1);
dispatch_time_t overTime = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_semaphore_wait(signal, overTime);
NSLog(@"需要線程同步的操作1 開始");
sleep(2);
NSLog(@"需要線程同步的操作1 結束");
//這個函數會使傳入的信號量dsema的值加1;
dispatch_semaphore_signal(signal);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
//信號量dsema的值減1
//作用是這樣的,如果dsema信號量的值大于0,該函數所處線程就繼續執行下面的語句,并且將信號量的值減1;如果desema的值為0,那么這個函數就阻塞當前線程等待timeout(注意timeout的類型為dispatch_time_t,不能直接傳入整形或float型數),如果等待的期間desema的值被dispatch_semaphore_signal函數加1了,且該函數(即dispatch_semaphore_wait)所處線程獲得了信號量,那么就繼續向下執行并將信號量減1。如果等待期間沒有獲取到信號量或者信號量的值一直為0,那么等到timeout時,其所處線程自動執行其后語句。
dispatch_semaphore_wait(signal, overTime);
NSLog(@"需要線程同步的操作2");
dispatch_semaphore_signal(signal);
});
三丶注意
1.block的使用,指針弱化情況;