多線程之GCD常用函數(shù)

1. GCD延時(shí)執(zhí)行

1.1 延時(shí)執(zhí)行常用的方法有2種

分別是 performSelector 和NSTimer

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

其中 performSelector的用法

[self performSelector:@selector(test) withObject:nil afterDelay:2.0];

其中 NSTimer的用法

/*
     第一參數(shù):延遲的時(shí)間,也就是多少秒后執(zhí)行
     第二參數(shù):指定一個(gè)對(duì)象發(fā)送,通常是當(dāng)前界面,self
     第三參數(shù):調(diào)用的函數(shù)
     第四參數(shù):計(jì)時(shí)器的用戶信息
     第五參數(shù):YES,就會(huì)循環(huán)執(zhí)行,直至失效。NO,只會(huì)執(zhí)行一次
     */
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];

1.2 GCD延時(shí)執(zhí)行的方法

// 主隊(duì)列
//    dispatch_queue_t queue = dispatch_get_main_queue();
    // 開(kāi)線程
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    /*
     第一參數(shù): DISPATCH_TIME_NOW 從現(xiàn)在開(kāi)始計(jì)算時(shí)間
     第二參數(shù)(delayInSeconds): 要延遲的時(shí)間 2.0 GCD時(shí)間單位:納秒
     第三參數(shù)(dispatch_get_main_queue): 主隊(duì)列
     第四參數(shù)^{ }:寫需要執(zhí)行的代碼
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
        
        NSLog(@"GCD------%@",[NSThread currentThread]);
        
    });

2. GCD一次性代碼

  • 作用:一次性代碼:整個(gè)應(yīng)用程序運(yùn)行過(guò)程中只會(huì)被執(zhí)行一次 不能放在懶加載中,應(yīng)用場(chǎng)景:?jiǎn)卫J?/li>
 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"----once-----");
    });

3. GCD知識(shí)點(diǎn)補(bǔ)充

  • GCD中的定時(shí)器
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     // 1.創(chuàng)建GCD中的定時(shí)器
     /*
     第一參數(shù)(DISPATCH_SOURCE_TYPE_TIMER): source 的類型 DISPATCH_SOURCE_TYPE_TIMER 表示是定時(shí)器
     第二參數(shù)(0): 描述信息,線程ID
     第三參數(shù)(0): 更詳細(xì)的描述信息
     第四參數(shù)(<#dispatchQueue#>): 隊(duì)列,決定GCD定時(shí)器中的任務(wù)在哪個(gè)線程中執(zhí)行
     */
    // 注意:需要strong 強(qiáng)引用后才能運(yùn)行使用,不強(qiáng)引用運(yùn)行期間可能會(huì)被釋放掉
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

   // 2. 設(shè)置定時(shí)器(起始時(shí)間 | 間隔時(shí)間 | 精準(zhǔn)度)
    /*
     第一參數(shù)(timer): 創(chuàng)建的定時(shí)器對(duì)象
     第二參數(shù)(DISPATCH_TIME_NOW): 起始時(shí)間, DISPATCH_TIME_NOW 從現(xiàn)在開(kāi)始計(jì)時(shí)
     第三參數(shù)(<#intervalInSeconds#> * NSEC_PER_SEC): 間隔時(shí)間,2.0 --- GCD 中時(shí)間單位是納秒,
     第四參數(shù)(<#leewayInSeconds#> * NSEC_PER_SEC): 精準(zhǔn)度 絕對(duì)精準(zhǔn) 0
     */
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);

    // 3. 設(shè)置定時(shí)器執(zhí)行的任務(wù) - 通過(guò)block塊的方式操作
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"GCD --- %@",[NSThread currentThread]);
    });
    // 4.啟動(dòng)執(zhí)行
    dispatch_resume(timer);

    self.timer = timer;
    // 啟動(dòng)程序,不執(zhí)行的原因:是因?yàn)?秒后timer被釋放
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,793評(píng)論 0 17
  • 前言 嘿嘿嘿,精品。 概述 全稱是Grand Central Dispatch,可譯為“牛逼的中樞調(diào)度器”。純C語(yǔ)...
    Ostkaka丶閱讀 1,118評(píng)論 0 12
  • 本文首發(fā)于我的個(gè)人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「?jìng)魉烷T」[https...
    ITCharge閱讀 349,108評(píng)論 308 1,926
  • 1. GCD簡(jiǎn)介 什么是GCD呢?我們先來(lái)看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 412評(píng)論 0 0
  • 公司:慧友冠源科技有限公司 【日精進(jìn)打卡第158天】 【知~學(xué)習(xí)】 早晨誦讀: 《六項(xiàng)精進(jìn)》大綱1遍 《六項(xiàng)精進(jìn)通...
    江陽(yáng)水閱讀 85評(píng)論 0 0