GCD常用方法

来源:互联网 发布:c# 数据库接口开发 编辑:程序博客网 时间:2024/05/31 04:03
1、常用的方法dispatch_async
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 耗时的操作  
    dispatch_async(dispatch_get_main_queue(), ^{  
        // 更新界面  
    });  
});

2、dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"group1");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"group2");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"group3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"updateUI");
    });
long result = dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // 第二个参数是等待时间 DISPATCH_TIME_FOREVER 永久等待,result 恒为0

   
if (result == 0) { // 全部处理执行结束

       
    }else{
       // 不返回0,表示超时后某个线程还没有结束
    }
//    dispatch_release(group);

3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:

    dispatch_queue_t queue = dispatch_queue_create("gcdtest", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"dispatch_async1");
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:4];
        NSLog(@"dispatch_async2");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"dispatch_barrier_async");
        [NSThread sleepForTimeInterval:4];
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"dispatch_async3");
    });

4、dispatch_apply 
执行某个代码片段N次。
dispatch_apply(5, globalQ, ^(size_t index) {
    // 执行5次
});

5.dispatch_affter
// 延迟3秒后执行 
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC); // 用于计算相对时间
//    dispatch_time_t wallTime = dispatch_walltime(const struct timespec *when, <#int64_t delta#>); //用于计算绝对时间  
// 3秒后追加处理到dispatch_get_main_queue

dispatch_after(time, dispatch_get_main_queue
(), ^{
       
NSLog(@"延迟3秒后执行");
    });

/**
 *  serial Dispatch Queue
dispatch_barrier_async函数是大粒度的保证线程安全

    Dispatch Semaphore是小粒度的
 */
- (
void
)dispatch_semaphore_t
{
   
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0
);
   
/**
生成
dispatch_semaphore_t
@param 1 semahpore设为1,表示能够访问array的线程只能有一个
 */  
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1
);
   
NSMutableArray *array = [[NSMutableArrayalloc]initWithCapacity:0
];
   
for (int i =0; i < 1000
; ++i) {
       
dispatch_async
(queue, ^{          
// semaphore的值大于或等于1时,就把semaphore的值减1           
// 等待semaphore的值大于或等于1,由于等待时间为DISPATCH_TIME_FOREVER,所以执行结果恒为0,即下面这行代码执行完后,一定是线程安全       
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER
);
           
// 安全的进行操作
[array addObject:[NSNumbernumberWithInt:i]];         
/**
排他控制处理结束           
所以将semaphore计数加1             
如果有 dispatch_semaphore_wait函数等待
 */           
dispatch_semaphore_signal
(semaphore);
        });
    }
   
}
原创粉丝点击