iOS_經驗(5)_GCD 使用總結

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的使用,指針弱化情況;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容