Dispatch

  • Managing Units of Work(管理工作單位)

調(diào)度塊允許您直接配置隊列中各個工作單元的屬性。它們還允許您處理個別工作單位,以等待其完成两波,并通知其完成和/或取消它們

  • dispatch_block_t

1.這是提交給dispatch隊列的塊的原型静浴,它不帶參數(shù),也沒有返回值渠概。
2.創(chuàng)建block的方式有兩種

  • 2.1:dispatch_block_create

2.1.1

  • 2.2:dispatch_block_create_with_qos_class
dispatch_block_t blockT=dispatch_block_create(0, ^{
        NSLog(@"11111");
    });
    NSLog(@"22222");
    dispatch_queue_t myQueue=dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(myQueue, blockT);
    NSLog(@"33333");
    
    //第三個參數(shù)設(shè)置成1 居然在下面dispatch_async(myQueue, blockY);處奔潰,不知道是不是死鎖,暫不知原因
    dispatch_block_t blockY=dispatch_block_create_with_qos_class(1, QOS_CLASS_USER_INTERACTIVE, 0, ^{
        NSLog(@"44444");
    });
    
    dispatch_async(myQueue, blockY);
    NSLog(@"5555");

參數(shù):
參數(shù)1:是一個dispatch_block_flags枚舉
DISPATCH_BLOCK_BARRIER
DISPATCH_BLOCK_DETACHED
DISPATCH_BLOCK_ASSIGN_CURRENT
DISPATCH_BLOCK_NO_QOS_CLASS
DISPATCH_BLOCK_INHERIT_QOS_CLASS
DISPATCH_BLOCK_ENFORCE_QOS_CLASS
并不太清楚具體原因
參數(shù)2.而 qos_class_t 是一種枚舉播揪,有以下類型:
QOS_CLASS_USER_INTERACTIVE: user interactive 等級表示任務(wù)需要被立即執(zhí)行贮喧,用來在響應(yīng)事件之后更新 UI,來提供好的用戶體驗猪狈。這個等級最好保持小規(guī)模箱沦。
QOS_CLASS_USER_INITIATED: user initiated 等級表示任務(wù)由 UI 發(fā)起異步執(zhí)行。適用場景是需要及時結(jié)果同時又可以繼續(xù)交互的時候雇庙。
QOS_CLASS_DEFAULT: default 默認(rèn)優(yōu)先級
QOS_CLASS_UTILITY: utility 等級表示需要長時間運行的任務(wù)谓形,伴有用戶可見進(jìn)度指示器。經(jīng)常會用來做計算疆前,I/O寒跳,網(wǎng)絡(luò),持續(xù)的數(shù)據(jù)填充等任務(wù)竹椒。這個任務(wù)節(jié)能童太。
QOS_CLASS_BACKGROUND: background 等級表示用戶不會察覺的任務(wù),使用它來處理預(yù)加載胸完,或者不需要用戶交互和對時間不敏感的任務(wù)书释。
QOS_CLASS_UNSPECIFIED: unspecified 未指明
參數(shù)3:

  • dispatch_function_t

1.提交調(diào)度隊列的函數(shù)原型
2.函數(shù)可以接受一個dispatch_function_t類型作為參數(shù),同時接受一個指向您提供上下文數(shù)據(jù)赊窥。調(diào)用調(diào)度函數(shù)時爆惧,將上下文數(shù)據(jù)的指針作為參數(shù)傳遞給函數(shù)。對上下文數(shù)據(jù)的指針未經(jīng)修改而傳遞給您的函數(shù)锨能,您有責(zé)任確保指針是有效的

  • dispatch_block_perform

1.從指定的塊和標(biāo)志創(chuàng)建扯再、同步執(zhí)行和釋放調(diào)度塊
2.在不需要對指定塊的堆或一個新塊對象的分配進(jìn)行復(fù)制的情況下,可以更有效地實現(xiàn)此功能
3.相當(dāng)于如下代碼

//調(diào)用
NSLog(@"11111");
    dispatch_block_perform(0, ^{
       
        NSLog(@"2222");
    });
    NSLog(@"3333");
//dispatch_block_perform相當(dāng)于如下
dispatch_block_t b = dispatch_block_create(flags, block);
b();
Block_release(b)
  • dispatch_block_wait

1.同步地等待址遇,直到執(zhí)行指定的調(diào)度塊已經(jīng)完成叔收,或者直到指定的超時已經(jīng)過去。
2.該函數(shù)會阻塞當(dāng)前線程進(jìn)行等待傲隶。傳入需要設(shè)置的 block 和等待時間 timeout 饺律。timeout 參數(shù)表示函數(shù)在等待 block 執(zhí)行完畢時,應(yīng)該等待多久跺株。如果執(zhí)行 block 所需的時間小于 timeout 复濒,則返回 0,否則返回非 0 值乒省。此參數(shù)也可以取常量DISPATCH_TIME_FOREVER 巧颈,這表示函數(shù)會一直等待 block 執(zhí)行完,而不會超時袖扛≡曳海可以使用 dispatch_time 函數(shù)和 DISPATCH_TIME_NOW 常量來方便的設(shè)置具體的超時時間十籍。
3.如果 block 執(zhí)行完成, dispatch_block_wait 就會立即返回唇礁。不能使用 dispatch_block_wait 來等待同一個 block 的多次執(zhí)行全部結(jié)束勾栗;這種情況可以考慮使用dispatch_group_wait 來解決。也不能在多個線程中盏筐,同時等待同一個 block 的結(jié)束围俘。同一個 block 只能執(zhí)行一次,被等待一次琢融。
4.注意:因為 dispatch_block_wait 會阻塞當(dāng)前線程界牡,所以不應(yīng)該放在主線程中調(diào)用

dispatch_queue_t concurrentQuene = dispatch_queue_create("concurrentQuene", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(concurrentQuene, ^{
        dispatch_queue_t allTasksQueue = dispatch_queue_create("allTasksQueue", DISPATCH_QUEUE_CONCURRENT);
        
        dispatch_block_t block = dispatch_block_create(0, ^{
            NSLog(@"開始執(zhí)行");
            [NSThread sleepForTimeInterval:3];
            NSLog(@"結(jié)束執(zhí)行");
        });
        
        dispatch_async(allTasksQueue, block);
        // 等待時長,10s 之后超時
        dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC));
        long resutl = dispatch_block_wait(block, timeout);
        if (resutl == 0) {
            NSLog(@"執(zhí)行成功");
        } else {
            NSLog(@"執(zhí)行超時");
        }
    });
  • dispatch_block_notify

1.可理解為監(jiān)聽
2.在指定的調(diào)度塊執(zhí)行完成時漾抬,調(diào)度一個通知塊提交給隊列
3.該函數(shù)接收三個參數(shù)宿亡,第一個參數(shù)是需要監(jiān)視的 block,第二個參數(shù)是監(jiān)聽的 block 執(zhí)行結(jié)束之后要提交執(zhí)行的隊列 queue纳令,第三個參數(shù)是待加入到隊列中的 block她混。 和 dispatch_block_wait 的不同之處在于:dispatch_block_notify 函數(shù)不會阻塞當(dāng)前線程

  • dispatch_block_cancel

1.這個函數(shù)用異步的方式取消指定的 block

dispatch_queue_t myQueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
    // 耗時任務(wù)
    dispatch_block_t firstBlock = dispatch_block_create(0, ^{
        NSLog(@"開始第一個任務(wù):%d",[NSThread isMainThread]);
        [NSThread sleepForTimeInterval:1.5f];
        NSLog(@"結(jié)束第一個任務(wù)");
    });
    // 耗時任務(wù)
    dispatch_block_t secBlock = dispatch_block_create(0, ^{
        NSLog(@"開始第二個任務(wù):%d",[NSThread isMainThread]);
        [NSThread sleepForTimeInterval:2.f];
        NSLog(@"結(jié)束第二個任務(wù)");
    });
    dispatch_async(myQueue, firstBlock);
    dispatch_async(myQueue, secBlock);
    // 等待 1s,讓第一個任務(wù)開始運行,因為myQueue是串行隊列泊碑,遵守fifo先進(jìn)先出的規(guī)則,所以必須先執(zhí)行完block1毯欣,才能執(zhí)行block2
    [NSThread sleepForTimeInterval:1];
    NSLog(@"休眠:%d",[NSThread isMainThread]);
    dispatch_block_cancel(firstBlock);
    NSLog(@"準(zhǔn)備取消第一個任務(wù)");
    dispatch_block_cancel(secBlock);
    NSLog(@"準(zhǔn)備取消第二個任務(wù)");
    /*
     打印的結(jié)果為:
     2017-07-06 18:32:04.046 多線程-GCD[6427:205689] 開始第一個任務(wù):0
     2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 休眠:1
     2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 準(zhǔn)備取消第一個任務(wù)
     2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 準(zhǔn)備取消第二個任務(wù)
     2017-07-06 18:32:05.547 多線程-GCD[6427:205689] 結(jié)束第一個任務(wù)
     可見 dispatch_block_cancel 對已經(jīng)在執(zhí)行的任務(wù)不起作用馒过,只能取消尚未執(zhí)行的任務(wù)
     */
  • dispatch_block_testcancel

1.測試給定的調(diào)度塊是否已被取消
2.如果取消調(diào)度塊,則返回一個非零值酗钞,否則為零

  • Prioritizing Work and Specifying Quality of Service(優(yōu)先工作和指定服務(wù)質(zhì)量

)

  • Dispatch Queue Priorities

1.用于選擇適當(dāng)?shù)娜植l(fā)隊列(global concurrent queue)
1.1 DISPATCH_QUEUE_PRIORITY_HIGH:這個常數(shù)映射到 QOS_CLASS_USER_INITIATED類
發(fā)送到隊列的項目以高優(yōu)先級運行腹忽;隊列在任何默認(rèn)優(yōu)先級或低優(yōu)先級隊列之前調(diào)度執(zhí)行
1.2 DISPATCH_QUEUE_PRIORITY_DEFAULT:這個常數(shù)映射到 QOS_CLASS_DEFAULT類
發(fā)送到隊列的項目以默認(rèn)優(yōu)先級運行;隊列在所有高優(yōu)先級隊列已排定之后執(zhí)行調(diào)度砚作,但在調(diào)度任何低優(yōu)先級隊列之前
1.3 DISPATCH_QUEUE_PRIORITY_LOW:這個常數(shù)映射到 QOS_CLASS_UTILITY類
發(fā)送到隊列的項目以低優(yōu)先級運行窘奏;隊列在所有默認(rèn)優(yōu)先級和高優(yōu)先級隊列已排定之后執(zhí)行調(diào)度
1.4 DISPATCH_QUEUE_PRIORITY_BACKGROUND:這個常數(shù)映射到QOS_CLASS_BACKGROUND類
發(fā)送到隊列的項目以后臺優(yōu)先級運行;隊列在所有高優(yōu)先級隊列被調(diào)度后執(zhí)行調(diào)度葫录,系統(tǒng)在其優(yōu)先級為后臺狀態(tài)設(shè)置的線程上運行項目着裹。這樣一個線程的優(yōu)先級最低,任何磁盤I/O是節(jié)流米同,減少對系統(tǒng)的影響

2.在MacOS 10.10以后骇扇,利用QoS類代替。有關(guān)更多信息面粮,請參見服務(wù)質(zhì)量類(QoS)

  • dispatch_qos_class_t
  • dispatch_queue_priority_t
  • dispatch_queue_get_qos_class
  • dispatch_queue_attr_make_with_qos_class

如上這幾個少孝,官方文檔并沒有做過多介紹,了解就行

  • Using Dispatch Groups(利用調(diào)度組)

分組塊允許聚合同步熬苍。您的應(yīng)用程序可以提交多個塊稍走,并在它們?nèi)客瓿蓵r跟蹤它們,即使它們可能在不同的隊列上運行。當(dāng)所有指定的任務(wù)都完成后婿脸,你再需要做什么行為時粱胜,這種類是有幫助的

  • dispatch_group_t

1.提交一組塊對象給隊做為異步調(diào)用
2.調(diào)度組是監(jiān)視一組塊的機制。應(yīng)用程序可以根據(jù)需要同步或異步監(jiān)視組中的塊盖淡。通過擴展年柠,一個組可以用于對依賴于其他任務(wù)完成的代碼進(jìn)行同步。
注意褪迟,組中的塊可以在不同的隊列上運行冗恨,并且每個單獨的塊可以向組添加更多的塊

  • dispatch_group_async

1.將block(任務(wù))提交到指定的隊列中,并且將次任務(wù)放到(關(guān)聯(lián))指定的group,block將異步執(zhí)行
2.參數(shù)
group:要關(guān)聯(lián)的組。該組由系統(tǒng)保留味赃,直到該塊運行完成為止掀抹。此參數(shù)不能為空
queue:為異步調(diào)用提交塊對象的調(diào)度隊列。隊列被系統(tǒng)保留心俗,直到該塊運行到完成為止傲武。此參數(shù)不能為空
block:異步執(zhí)行的塊對象。這個函數(shù)執(zhí)行代表調(diào)用者的block_copy和block_release

  • dispatch_group_async_f

1.這個方法跟dispatch_group_async差不多城榛,只是第三個參數(shù)為c語言函數(shù)

  • dispatch_group_notify_f

1.當(dāng)group中的任務(wù)都完成以后會執(zhí)行block.注意這句代碼要加到所有任務(wù)提交之后才管用.參數(shù)queue代表block會提交到哪個隊列中

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t conCurrentQueue =  dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, serialQueue, ^{
        NSLog(@"串行隊列任務(wù)一開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"串行隊列任務(wù)一快結(jié)束:%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, serialQueue, ^{
        NSLog(@"串行隊列任務(wù)二開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"串行隊列任務(wù)二快結(jié)束:%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, conCurrentQueue, ^{
       
        NSLog(@"并行隊列任務(wù)二開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"并行隊列任務(wù)二快結(jié)束:%@",[NSThread currentThread]);
        
    });
    dispatch_group_notify(group, conCurrentQueue, ^{
       
        NSLog(@"被通知的并行隊列任務(wù)三");
    });  
//結(jié)果時“被通知的并行隊列任務(wù)三”是在所有任務(wù)都執(zhí)行完成后才執(zhí)行
  • dispatch_group_wait

1.為先前提交的塊對象同步地等待完成揪利;如果在指定的超時時間結(jié)束之前塊沒有完成,則返回
2.同步等待會阻塞線程狠持,跟dispatch_block_wait原理一樣

dispatch_queue_t conCurrentQueue =  dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, conCurrentQueue, ^{
        NSLog(@"任務(wù)一開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"任務(wù)一快結(jié)束");
    });
    dispatch_group_async(group, conCurrentQueue, ^{
        NSLog(@"任務(wù)二開始");
        [NSThread sleepForTimeInterval:6];
        
        NSLog(@"任務(wù)二快結(jié)束");
    });
    
    dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
    long result=dispatch_group_wait(group, time);
    if (result==0) {
        NSLog(@"組的block全部執(zhí)行完成");
    }
    else{
        NSLog(@"組的block沒有全部執(zhí)行完成疟位,是timeout返回");
    }
    NSLog(@"-----------");
  • dispatch_group_enter

1.用這個方法指定一個操作將要加到group中,用來替代dispatch_group_async,注意它只能和dispatch_group_leave配對使用.
2.這種方式比dispatch_group_async更加靈活.比如我們可以在任務(wù)的完成回調(diào)里面寫dispatch_group_leave()

dispatch_queue_t conCurrentQueue =  dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_enter(group);
    dispatch_async(conCurrentQueue, ^{
        NSLog(@"任務(wù)一開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"任務(wù)一快結(jié)束");
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(conCurrentQueue, ^{
        NSLog(@"任務(wù)二開始");
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"任務(wù)二快結(jié)束");
        dispatch_group_leave(group);
    });
    
    dispatch_group_notify(group, conCurrentQueue, ^{
        NSLog(@"被通知任務(wù)開始");
    });
    NSLog(@"-----");
  • Using Dispatch Semaphores(利用調(diào)度信號量)

關(guān)于信號量的解釋,借別人的一個例子:
停車場剩余4個車位喘垂,那么即使同時來了四輛車也能停的下甜刻。如果此時來了五輛車,那么就有一輛需要等待正勒。信號量的值就相當(dāng)于剩余車位的數(shù)目得院,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車,dispatch_semaphore_signal章贞。就相當(dāng)于走了一輛車祥绞。停車位的剩余數(shù)目在初始化的時候就已經(jīng)指明了(dispatch_semaphore_create(value:Int))),調(diào)用一次dispatch_semaphore_signal鸭限,剩余的車位就增加一個就谜;調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個;當(dāng)剩余車位為0時里覆,再來車(即調(diào)用dispatch_semaphore_wait)就只能等待丧荐。有可能同時有幾輛車等待一個停車位。有些車主喧枷。沒有耐心虹统,給自己設(shè)定了一段等待時間弓坞,這段時間內(nèi)等不到停車位就走了,如果等到了就開進(jìn)去停車车荔。而有些車主就像把車停在這渡冻,所以就一直等下去

  • dispatch_semaphore_create
  1. 該函數(shù)使用一個初始值創(chuàng)建一個dispatch_semaphore_t類型的信號量,注意:這里的傳入的參數(shù)value必須大于或等于0,否則dispatch_semaphore_create會返回NULL
    2.參數(shù)就是信號量的初始值
  • dispatch_semaphore_wait

1.等待信號量忧便,該函數(shù)會使傳入的信號量dsema的值減1
2.函數(shù)的作用:如果dsema信號量的值大于0族吻,該函數(shù)所處線程就繼續(xù)執(zhí)行下面的語句,并且將信號量的值減1珠增;如果desema的值為0超歌,那么這個函數(shù)就阻塞當(dāng)前線程等待timeout(注意timeout的類型為dispatch_time_t,需要傳入對應(yīng)的類型參數(shù))蒂教,如果等待的期間desema的值被dispatch_semaphore_signal函數(shù)加1了巍举,且該函數(shù)(即dispatch_semaphore_wait)所處線程獲得了信號量,那么就繼續(xù)向下執(zhí)行并將信號量減1, 如果等待期間沒有獲取到信號量或者信號量的值一直為0凝垛,那么等到timeout時懊悯,其所處線程自動執(zhí)行其后語句。

  • dispatch_semaphore_signal

1.當(dāng)返回值為0時表示當(dāng)前并沒有線程等待其處理的信號量梦皮,其處理的信號量的值加1即可炭分。當(dāng)返回值不為0時,表示其當(dāng)前有(一個或多個)線程等待其處理的信號量剑肯,并且該函數(shù)喚醒了一個等待的線程(當(dāng)線程有優(yōu)先級時捧毛,喚醒優(yōu)先級最高的線程;否則隨機喚醒.

  • 關(guān)于信號量的用途和總結(jié)

0.注意退子,正常的使用順序是先降低然后再提高,這兩個dispatch_semaphore_wait 和dispatch_semaphore_signal函數(shù)通常成對使用
1.如果初始化信號量為1的話型将,相當(dāng)于給線程加鎖寂祥,因為信號量為1,不管什么情況下七兜,都會保證只有一個線程再訪問此關(guān)鍵代碼丸凭,是線程安全
2.可以相當(dāng)于設(shè)置最大并發(fā)數(shù)量,比如初始化的信號量為4腕铸,就算有五個線程來了惜犀,最多的情況也只會有四個同時進(jìn)行
3.加鎖


WechatIMG1.jpeg

如上所示,crash的原因翻譯過來是:就是說你malloc分配的內(nèi)存賦值給了一個已經(jīng)被釋放的指針(此指針已不存在)狠裹,其實我暫時不明白為什么會這樣報錯虽界,我的理解是也是因為多線程同時寫數(shù)組的的問題
修改成如下就行

dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    NSMutableArray * array = [[NSMutableArray alloc] init];
    for (int i =1; i<100; i++) {
        dispatch_async(myQueue, ^{
           
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            [array addObject:[NSString stringWithFormat:@"%d",i]];
            dispatch_semaphore_signal(semaphore);
        });
    }

4.設(shè)置多線程最大并發(fā)數(shù)

//crate的value表示,最多幾個資源可訪問
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //任務(wù)1
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
    //任務(wù)2
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    //任務(wù)3
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });
    /*
     2017-07-07 17:07:41.632 多線程-GCD[1125:163408] run task 1
     2017-07-07 17:07:41.632 多線程-GCD[1125:163421] run task 2
     2017-07-07 17:07:42.634 多線程-GCD[1125:163408] complete task 1
     2017-07-07 17:07:42.635 多線程-GCD[1125:163421] complete task 2
     2017-07-07 17:07:42.635 多線程-GCD[1125:163405] run task 3
     2017-07-07 17:07:43.640 多線程-GCD[1125:163405] complete task 3
     
     總結(jié):由于設(shè)定的信號值為2涛菠,先執(zhí)行兩個線程莉御,等執(zhí)行完一個撇吞,才會繼續(xù)執(zhí)行下一個,保證同一時間執(zhí)行的線程數(shù)不超過2
     這也相當(dāng)于設(shè)置了多線程的最大并發(fā)數(shù)
     */
  • Using Dispatch Barriers(柵欄)

對于柵欄的理解:假設(shè)我們原先有10個任務(wù)要執(zhí)行礁叔,我們現(xiàn)在要插入一個任務(wù)5牍颈,這個任務(wù)5要在1,2琅关,3煮岁,4,都并發(fā)執(zhí)行完了之后才能執(zhí)行涣易,而6画机,7,8都毒,9色罚,10號任務(wù)要在這個任務(wù)5結(jié)束后才允許并發(fā)。這是就需要用到Barriers账劲,當(dāng)然group也可以實現(xiàn)戳护,但是這個方法更好,關(guān)于柵欄的只能是同一個隊列,而group 可以是不同隊列瀑焦,柵欄最好別用系統(tǒng)的全部隊列而是使用自己的全部隊列

  • dispatch_barrier_async

1.提交異步執(zhí)行的障礙塊并立即返回腌且,不會阻塞線程
2.該方法的功能跟dispatch_async類似

  • dispatch_barrier_async_f

1.跟dispatch_barrier_async方法一樣,只會提交的是c函數(shù)

  • dispatch_barrier_sync

1.提交一個用于執(zhí)行的屏障塊對象榛瓮,并等待該塊完成
2.該方法功能跟dispatch_sync類似

  • dispatch_barrier_sync_f

1.跟dispatch_barrier_async方法一樣铺董,只會提交的是c函數(shù)

  • Managing Dispatch Sources

這個管理類對于我而言還是很少用到的,不過有個確實經(jīng)常用到的就是 time

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末禀晓,一起剝皮案震驚了整個濱河市精续,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粹懒,老刑警劉巖重付,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凫乖,居然都是意外死亡确垫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門帽芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來删掀,“玉大人,你說我怎么就攤上這事导街∨幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵搬瑰,是天一觀的道長付呕。 經(jīng)常有香客問我计福,道長,這世上最難降的妖魔是什么徽职? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任象颖,我火速辦了婚禮,結(jié)果婚禮上姆钉,老公的妹妹穿的比我還像新娘说订。我一直安慰自己,他們只是感情好潮瓶,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布陶冷。 她就那樣靜靜地躺著,像睡著了一般毯辅。 火紅的嫁衣襯著肌膚如雪埂伦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天思恐,我揣著相機與錄音沾谜,去河邊找鬼。 笑死胀莹,一個胖子當(dāng)著我的面吹牛基跑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播描焰,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼媳否,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荆秦?” 一聲冷哼從身側(cè)響起篱竭,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎步绸,沒想到半個月后掺逼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡靡努,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年坪圾,在試婚紗的時候發(fā)現(xiàn)自己被綠了晓折。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惑朦。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漓概,靈堂內(nèi)的尸體忽然破棺而出漾月,到底是詐尸還是另有隱情,我是刑警寧澤胃珍,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布梁肿,位于F島的核電站蜓陌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吩蔑。R本人自食惡果不足惜钮热,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烛芬。 院中可真熱鬧隧期,春花似錦、人聲如沸赘娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遣臼。三九已至性置,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揍堰,已是汗流浹背鹏浅。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留个榕,地道東北人篡石。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像西采,于是被迫代替她去往敵國和親凰萨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 3.1 Grand Central Dispatch(GCD)概要 3.1.1 什么是CGD Grand Cent...
    SkyMing一C閱讀 1,612評論 0 22
  • 同步/異步 同步:多個任務(wù)情況下械馆,一個任務(wù)A執(zhí)行結(jié)束胖眷,才可以執(zhí)行另一個任務(wù)B。只存在一個線程也就是主線程霹崎。 異步:...
    XLsn0w閱讀 297評論 0 0
  • 在向隊列中添加任務(wù)時珊搀,可以直接在對應(yīng)的函數(shù)中添加 block。但是如果想對任務(wù)進(jìn)行操作尾菇,比如監(jiān)聽任務(wù)境析、取消任務(wù),就...
    fuyoufang閱讀 9,008評論 3 23
  • “橘子,身邊的人和事時刻提醒著我默赂,我就是多余的沛鸵。你有過這種感覺嗎?” 距離看到這條信息已經(jīng)過去一個小時了,我呆呆的...
    橘子姑娘_閱讀 178評論 8 2
  • 答陸原靜書(二) 答“養(yǎng)生以靜心寡欲為要……愈不可矣”句曲掰; 學(xué)到現(xiàn)在疾捍,對于“純乎天理”有一些感覺,天理是本身...
    偶爾閑情閱讀 329評論 0 1