iOS多線程---GCD方法/實現(xiàn)Timer

多線程核心概念: 一個任務(wù) / 兩種隊列 / 兩種函數(shù).


1. 一個任務(wù): 執(zhí)行什么操作;
2. 執(zhí)行任務(wù)的兩種隊列: 
(1)并發(fā)隊列(Concurrent Dispatch Queue): 可以讓多個任務(wù)并發(fā)(同時)執(zhí)行(自動開啟多個線程同時執(zhí)行任務(wù)), 
前提是在dispatch_async異步函數(shù)下執(zhí)行; 
(2)串行隊列(Serial Dispatch Queue):一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù).

2.1 并發(fā)隊列和串行隊列的區(qū)別: 任務(wù)的執(zhí)行方式不同

---------------------------------------------------
3. 執(zhí)行任務(wù)的兩種函數(shù):
(1)同步函數(shù)dispatch_sync  < synchronous>: 不具備開啟新線程的能力; 
(2)異步函數(shù)dispatch_async <asynchronous>: 具備開啟新線程的能力

3.1 同步和異步區(qū)別:能不能開啟新的線程



多線程創(chuàng)建隊列的兩種方式


1. 通過dispatch_queue_create函數(shù)創(chuàng)建一個隊列;
2. 直接獲取現(xiàn)成的主線程dispatch隊列或者全局的dispatch隊列。




Paste_Image.png




GCD實現(xiàn)的Timer如圖所示:

Paste_Image.png

核心代碼:


//開始
- (IBAction)startTimer:(id)sender {
 __block int startTimer = 0;
    __weak typeof(self) weakself = self;
    
    //開啟專門的線程處理timer
    self.timerQueue = dispatch_queue_create("TimerQueue", 0);
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _timerQueue);
    /*----打出dispatch_s直接就出現(xiàn)下邊的代碼塊了---------*/
    /**
     *  第一個參數(shù): dispatch_source_t, Dispatch Source
     *  第二個參數(shù): 開始時刻;
     *  第三個參數(shù): 間隔<例子中是一秒>;
     *  第四個參數(shù): 精度<最高精度將之設(shè)置為0>
     */
    dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    //函數(shù)回調(diào)
    dispatch_source_set_event_handler(self.timer, ^{
        //回主線刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            weakself.label.text = [NSString stringWithFormat:@"%d", startTimer++];
        });
    });
    //默認(rèn)的dispatch_source_t是暫停, 開始監(jiān)聽
    dispatch_resume(self.timer);
    /*----打出dispatch_s直接就出現(xiàn)上邊的代碼塊了---------*/
    
}

dispatch_queue_create創(chuàng)建兩種隊列


//創(chuàng)建一個串行dispatch隊列, 第二個參數(shù)將其設(shè)置成NULL褥傍。
dispatch_queue_t mySerialDispatchQueue =
    dispatch_queue_create("com.example.gcd", NULL);

//創(chuàng)建一個串行dispatch隊列, 第二個參數(shù)就設(shè)置成DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t myConcurrentDispatchQueue =
    dispatch_queue_create( "com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);


具體操作

1.直接獲取線程的隊列


1. 主線程dispatch隊列: 所有任務(wù)都在主線程上執(zhí)行, 它是一個串行隊列。

dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

--------------------------------------------------


2. 全局的dispatch隊列: 它是并行隊列浅悉,可以在應(yīng)用程序的任何地方使用它們崖咨。
一般可以直接使用該隊列. 有四種優(yōu)先級:high, default, low 和 background队萤。


dispatch_queue_t globalDispatchQueueDefault =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


2. dispatch_set_target_queue 設(shè)置優(yōu)先級

dispatch_set_target_queue函數(shù)用于設(shè)置一個”目標(biāo)”隊列米母。創(chuàng)建隊列后勾扭,你可以用這個函數(shù)來修改隊列的優(yōu)先級。

3. dispatch_group_async 分組

等dispatch隊列中的所有任務(wù)完成了才執(zhí)行另外一個任務(wù)铁瞒。
dispatch_group_async就可以上場了.

4. dispatch_barrier_async 柵欄方式

dispatch_barrier_async函數(shù)用于等待隊列中其他任務(wù)完成妙色。
1. 當(dāng)你訪問數(shù)據(jù)庫或者一個文件的時候,你可以用串行隊列來避免數(shù)據(jù)沖突慧耍。
2. 多個讀取操作是可以同時進行的身辨,這樣可以更高效的訪問數(shù)據(jù),但更新數(shù)據(jù)時必須等其他操作結(jié)束, 如果使用前兩種方式會很麻煩.
3. dispatch_barrier_async 創(chuàng)建了一個并發(fā)隊列芍碧,然后向隊列中添加了一些讀取操作煌珊。會等本次操作以前的完全執(zhí)行才執(zhí)行.


5. dispatch_apply

dispatch_apply函數(shù)會像dispatch_sync函數(shù)一樣等待所有任務(wù)完成,

//串行隊列是有序的
    dispatch_apply(5, syncQueue, ^(size_t index) {
        NSLog(@"++++++ %zu", index);
    });
    
    順序: 01234


//并發(fā)隊列是無序
    dispatch_apply(5, asyncQueue, ^(size_t index) {
        NSLog(@"----%zu", index);
    });
    
    順序不固定




6. dispatch_semaphore_t 信號量

并發(fā)讀取或更新數(shù)據(jù)時很容易造成數(shù)據(jù)沖突或者程序崩潰泌豆。
當(dāng)你需要對一小部分間隔時間較短的任務(wù)做并發(fā)控制的時候定庵,Semaphore(信號量)會比串行隊列或者dispatch_barrier_async更好用。

Dispatch semaphore是一個帶有一個計數(shù)器的信號量踪危。信號量有點像一個交通信號標(biāo)志蔬浙,標(biāo)志起來的時候你
可以走,標(biāo)準(zhǔn)落下的時候你要停下來贞远。Dispatch semaphore用計數(shù)器來模擬這種標(biāo)志畴博。計數(shù)器為0,隊列暫停
執(zhí)行新任務(wù)并等待信號蓝仲;當(dāng)計數(shù)器超過0后俱病,隊列繼續(xù)執(zhí)行新任務(wù),并減少計數(shù)器袱结。
//用dispatch_semaphore_create函數(shù)庶艾。
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
//dispatch_semaphore_wait函數(shù)用于等待一個信號量。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);

long result = dispatch_semaphore_wait(semaphore, time);
if (result == 0){
/*
 * 信號量計數(shù)器大于等于1擎勘。
 * 或者在指定的等待時間超時前咱揍,信號量計數(shù)器變成了大于等于1的數(shù)字。
 * 計數(shù)器會自動減一
 *
 * 在這里棚饵,可以安全地運行你的任務(wù)了煤裙。
 */
}else{
/*
 * 因為信號量計數(shù)器是0,就只能等待超時了噪漾。
 * 
 * 這里處理等待超時的情況硼砰。
 */
}

GCD支持方法示例代碼
GCD實現(xiàn)的Timer代碼

GCD使用詳解

更多精彩內(nèi)容請關(guān)注“IT實戰(zhàn)聯(lián)盟”哦~~~


IT實戰(zhàn)聯(lián)盟.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市欣硼,隨后出現(xiàn)的幾起案子题翰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豹障,死亡現(xiàn)場離奇詭異冯事,居然都是意外死亡,警方通過查閱死者的電腦和手機血公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門昵仅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累魔,你說我怎么就攤上這事居夹∷己埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵叹阔,是天一觀的道長贤旷。 經(jīng)常有香客問我却紧,道長稻薇,這世上最難降的妖魔是什么枕赵? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮晚伙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俭茧。我一直安慰自己咆疗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布母债。 她就那樣靜靜地躺著午磁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毡们。 梳的紋絲不亂的頭發(fā)上迅皇,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音衙熔,去河邊找鬼登颓。 笑死,一個胖子當(dāng)著我的面吹牛红氯,可吹牛的內(nèi)容都是我干的框咙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼痢甘,長吁一口氣:“原來是場噩夢啊……” “哼喇嘱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塞栅,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤者铜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體作烟,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愉粤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俗壹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片科汗。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绷雏,靈堂內(nèi)的尸體忽然破棺而出头滔,到底是詐尸還是另有隱情,我是刑警寧澤涎显,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布坤检,位于F島的核電站,受9級特大地震影響期吓,放射性物質(zhì)發(fā)生泄漏早歇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一讨勤、第九天 我趴在偏房一處隱蔽的房頂上張望箭跳。 院中可真熱鬧,春花似錦潭千、人聲如沸谱姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屉来。三九已至,卻和暖如春狈癞,著一層夾襖步出監(jiān)牢的瞬間茄靠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工蝶桶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慨绳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓真竖,卻偏偏與公主長得像儡蔓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疼邀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 程序中同步和異步是什么意思喂江?有什么區(qū)別? 解釋一:異步調(diào)用是通過使用單獨的線程執(zhí)行的旁振。原始線程啟動異步調(diào)用获询,異步調(diào)...
    風(fēng)繼續(xù)吹0閱讀 1,027評論 1 2
  • 最近頗花了一番功夫把多線程GCD人的一些用法總結(jié)出來涨岁,一來幫自己鞏固一下知識、二來希望能幫到對這一塊還迷茫...
    人活一世閱讀 284評論 1 1
  • 目錄:iOS多線程(一)--pthread吉嚣、NSThreadiOS多線程(二)--GCD詳解iOS多線程(三)--...
    Claire_wu閱讀 1,062評論 0 6
  • 云計算Cloud Computing 這一術(shù)語梢薪,意味著強大、高速尝哆、可擴展性秉撇。實際上,云相當(dāng)于那些擁有無限擴展能力...
    不羈小生閱讀 162評論 0 0