iOS開發(fā)多線程(GCD)

相關概念

  • 隊列:用于儲存任務
  • 線程:處理任務的單元
  • sync:同步處理(立即處理)
  • async:異步處理(稍后處理或者開啟其他線程處理)
  • dispatch_source_t:定時器(資源)

分析(線程任務)

  • 主線程中同步處理主隊列任務
    結果會是死鎖:原因是同一線程不能跳步執(zhí)行串行隊列(主隊列是串行隊列)任務淮捆。
dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"____");
    });
  • 主線程中異步處理主隊列任務
    結果會按照以下log順序:異步意味著不立即執(zhí)行新任務辕羽,但是任務在主隊列中(主隊列任務只能在主線程執(zhí)行)会喝。
NSLog(@"-----1");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"-----3");
    });
    sleep(3);
    NSLog(@"-----2");
  • 主線程中異步處理全局隊列任務(全局隊列屬于并發(fā)隊列)
    結果會按照以下log順序:異步意味著不立即執(zhí)行新任務空闲,但是可以分配給其他線程執(zhí)行(幾乎立刻)催跪。
NSLog(@"-----1");
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"-----2");// 子線程
    });
    sleep(3);
    NSLog(@"-----3");
  • 主線程中同步處理全局隊列任務(全局隊列屬于并發(fā)隊列)
    結果會按照以下log順序:同步意味著立即執(zhí)行新任務投蝉,暫停當前隊列的當前任務裙士。
    NSLog(@"-----1");
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"-----2");//主線程
    });
    NSLog(@"-----3");
    sleep(3);
    NSLog(@"-----4");
  • 主線程異步串行隊列任務膊爪,然后在線程3(子線程)中同步本串行隊列任務出現(xiàn)死鎖自阱。
dispatch_queue_t dispatchQueue = dispatch_queue_create("xin.queue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(dispatchQueue, ^{
        NSLog(@"currentThread,%@", [NSThread currentThread]); // 線程3
        [self openNewActionWithQue:dispatchQueue];
    });
- (void)openNewActionWithQue:(dispatch_queue_t)queue {
    NSLog(@"currentThread,%@", [NSThread currentThread]);線程3
    dispatch_sync(queue, ^{ // 發(fā)生死鎖
        NSLog(@"currentThread,%@", [NSThread currentThread]);
    });
}
  • 小結
    1. 主線程(UI)線程可以執(zhí)行其他隊列的任務,但是主隊列任務只會在主線程中執(zhí)行米酬。
    2. {}之中的代碼在runloop看來都是一次任務
    3. 串行隊列不是棧邏輯沛豌,而是先進先出。
    4. 前面代碼分析了在主線程中開啟處理新任務的情況赃额,在此基礎上可以分析出子線程的相應情況加派。

分析(dispatch_source_t)

看段代碼

#import "TestViewController.h"

@interface TestViewController ()
@property(nonatomic,strong) dispatch_source_t timer;
@end
@implementation TestViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    __block NSInteger timeout = 10;//倒計總時間
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    __weak typeof(_timer) timer2 = _timer;
    dispatch_source_set_timer(timer2,dispatch_walltime(NULL, 0),1*NSEC_PER_SEC, 0); //每秒執(zhí)行
    dispatch_source_set_event_handler(timer2, ^{
        NSLog(@"%s",__func__);
        if(timeout<=0){ //倒計時結束,關閉
            dispatch_source_cancel(timer2);
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
            });
            timeout-=1;
        }
    });
    dispatch_resume(_timer);
}
- (void)dealloc {
    NSLog(@"%s",__func__);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
  • 此段小結
    1. dispatch_source_cancel()可以取消block任務跳芳;
    2. dispatch_source_t是ARC管理的(當控制器銷毀時芍锦,定時器block任務被取消);
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飞盆,一起剝皮案震驚了整個濱河市娄琉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吓歇,老刑警劉巖车胡,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異照瘾,居然都是意外死亡匈棘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門析命,熙熙樓的掌柜王于貴愁眉苦臉地迎上來主卫,“玉大人逃默,你說我怎么就攤上這事〈亟粒” “怎么了完域?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘩将。 經(jīng)常有香客問我吟税,道長,這世上最難降的妖魔是什么姿现? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任肠仪,我火速辦了婚禮,結果婚禮上备典,老公的妹妹穿的比我還像新娘异旧。我一直安慰自己,他們只是感情好提佣,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布吮蛹。 她就那樣靜靜地躺著,像睡著了一般拌屏。 火紅的嫁衣襯著肌膚如雪潮针。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天倚喂,我揣著相機與錄音然低,去河邊找鬼。 笑死务唐,一個胖子當著我的面吹牛雳攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枫笛,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吨灭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刑巧?” 一聲冷哼從身側響起喧兄,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啊楚,沒想到半個月后吠冤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡恭理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年拯辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡涯保,死狀恐怖诉濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夕春,我是刑警寧澤未荒,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站及志,受9級特大地震影響片排,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜速侈,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一率寡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌畸,春花似錦勇劣、人聲如沸靖避。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻捏。三九已至盆犁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篡九,已是汗流浹背谐岁。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榛臼,地道東北人伊佃。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像沛善,于是被迫代替她去往敵國和親航揉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359