GCD(2)

dispatch_sync

dispatch_async函数的”async”意味着非同步,就是将指定的Block非同步的追加到指定的Dispatch Queue中,disptch_async函数不做任何等待;相对应的”sync”意味着同步,也就是说将指定的Block同步追加到Dispatch Queue中,在追加Block结束前,dispatch_sync函数会一直等待

应用情景:执行Main Dispatch Queue时,使用另外的线程Global Dispatch Queue进行处理,处理结束后立即使用所得到的结果

dispatch_queue_t  queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

dispatch_sync(queue,^{/*处理*/});

注意:死锁问题

dispatch_queue_t  queue = dispatch_get_main_queue()

dispatch_sync(queue,^{NSLog(@"Hello ?")});

dispatch_queue_t  queue = dispatch_queue_create("com,example.gcd.MySerialDispachQueue", NULL);

    dispatch_async(queue,^{

        dispatch_sync(queue, ^{

            NSLog(@"hello");

        })

});

 

dispatch_apply

该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束

dispatch_queue_t  queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 dispatch_apply(10, queue, ^(size_t index) {

        NSLog(@"%zu",index);

    });

NSLog(@"done");

dispatch_suspend/dispatch_resume

当追加大量处理到Dispatch Queue时,在追加处理的过程中,有时希望不执行已追加的处理,这时只要挂起Dispatch Queue,当可以执行时再恢复

//挂起

dispatch_suspend(queue);

//恢复

dispatch_resume(queue);

Dispatch Semaphore

是持有计数的信号,该计数是多线程编程中的计数类型信号。计数值为0时等待,计数为1或大于1时,减去1而不等待

//create

dispatch_semaphore_t semaphore =dispatch_semaphore_create(1);

 

//持有

dispatch_retain(semaphore);

 

//释放

dispatch_release(semaphore);

 

//阻塞等待

   dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull*NSEC_PER_SEC);

    long result = dispatch_semaphore_wait(semaphore, time);

    if (result == 0) {

        /*计数值大于0*/

    }else{

        /*等待time时间后,计数值仍然为0*/

}

在等待时间内,接收到single消息 dispatch_semaphore_wait立即返回

 

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

    NSMutableArray *array = [[NSMutableArray alloc]init];

    for (int i = 0; i < 1000; i++) {

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        [array addObject:[NSNumber numberWithInt:i]];

        dispatch_semaphore_signal(semaphore);

    }

dispatch_release(semaphore);

 

dispatch_once

dispatch_once函数是保证在应用程序执行中只执行一次指定处理的API

static dispatch_once_t pred;

dispatch_once(&pred,^{

/*初始化*/

});

单例模式:

+ (AnObject *)sharedSnashotRecordsMgr

{

    static AnObject *_sharedInstance = nil;

    static dispatch_once_t predicate;

    dispatch_once(&predicate, ^{

        _sharedInstance = [[AnObject alloc] init];

    });

    return _sharedInstance;

}

 

原文地址:https://www.cnblogs.com/PJXWang/p/4917478.html