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);
});
}
}
阅读全文
0 0
- GCD常用方法
- GCD常用方法
- 66 GCD常用方法
- GCD的常用方法
- iOS GCD常用方法
- GCD的常用方法
- GCD常用方法
- GCD常用方法
- GCD 常用方法dispatch_async
- iOS GCD常用方法总结
- GCD的常用方法总结
- [IOS 开发] GCD常用方法
- GCD 常用的几个方法
- [Swift 开发] GCD常用方法
- iOS GCD集汇(三)GCD常用方法总结
- 多线程的常用方法及GCD
- Swift 3.0中GCD的常用方法
- objc.io 2.3 GCD常用方法 (转)
- java中变量 以及使用变量的原因
- 一个工具类的全局静态方法生成uuid
- 5.16特长生模拟题 遭遇战
- UVA-10590 正整数拆分
- 制作Centos usb 安装盘 for Mac
- GCD常用方法
- AsyncTask使用总结
- BaseDialog的封装
- 公开密钥加密技术(公钥和私钥)
- 轻量级的.NET对象查找服务和AOP开发框架Netop.Core源码解说(2)--配置
- vs编译器一些常见错误
- js中字符串常用截取函数
- (47)按键绑定编辑器
- window.onload用法详解