[IOS笔记]

block: block是c的一个运行时特性,和函数指针类似,用户回调函数。主要用于并行线程。

//创建一个分发队列,第一个参数为队列名,第二个参数是保留的 dispatch_queue 属性,设为null
//可使用函数 dispatch_queue_t dispatch_get_global_queue(long priority, unsigned long flags);来获得全局的 dispatch_queue,参数 priority 表示优先级,
dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
//将一个 block 加入一个 dispatch_queue,这个 block 会再其后得到调度时,并行运行。一个queue可以加入多个block,这些 blocks 是按照 FIFO(先入先出)规则调度的,先加入的先执行,后加入的一定后执行,但在某一个时刻,可能有多个 block 同时在执行。实际结果是第一个执行完执行第二个。
dispatch_sync(queue, ^(void){
        for (int i=0; i<100; ++i) {
            NSLog(@"i:%d", i);
        }
});

信号:sem

//创建信号,将其资源初始值设置为 0 (不能少于 0),表示任务还没有完成,没有资源可用主线程不要做事情。
    __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    __block dispatch_semaphore_t sem2 = dispatch_semaphore_create(0);
    
    dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
    dispatch_sync(queue, ^(void){
        for (int i=0; i<100; ++i) {
            NSLog(@" block 1 i:%d", i);
        }
        //增加 semaphore 计数(可理解为资源数),表明任务完成,有资源可用主线程可以做事情了。
        dispatch_semaphore_signal(sem);
    });
    dispatch_sync(queue, ^(void){
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        for (int i=0; i<100; ++i) {
            NSLog(@" block 2 i:%d", i);
        }
        dispatch_semaphore_signal(sem2);
    });
    
    //等待信号,主线程继续运行,减少 semaphore 的计数,如果资源数少于 0,则表明资源还可不得,我得按照FIFO(先等先得)的规则等待资源就绪,一旦资源就绪并且得到调度了,我再执行。
    dispatch_semaphore_wait(sem2, DISPATCH_TIME_FOREVER);
    dispatch_release(queue);
    dispatch_release(sem);

group

将block加入到group,group中所有block执行完之后,主线程才可以继续运行

//创建信号,将其资源初始值设置为 0 (不能少于 0),表示任务还没有完成,没有资源可用主线程不要做事情。
    __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    
    dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^(void){
        for (int i=0; i<100; ++i) {
            NSLog(@" block 1 i:%d", i);
        }
        //增加 semaphore 计数(可理解为资源数),表明任务完成,有资源可用主线程可以做事情了。
        dispatch_semaphore_signal(sem);
    });
    
    dispatch_block_t block2 = ^(void){
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        for (int i=0; i<100; ++i) {
            NSLog(@" block 2 i:%d", i);
        }
    };
    dispatch_group_async(group, queue, block2);
    
    //主线程等待block执行完成
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    dispatch_release(group);
    dispatch_release(queue);
    dispatch_release(sem);

子线程运行完

dispatch_async(getDataQueue,^{
    //获取数据,获得一组后,刷新UI.
    dispatch_aysnc (mainQueue, ^{
    //UI的更新需在主线程中进行
};
}
)
原文地址:https://www.cnblogs.com/zengyou/p/3325998.html