文章26 | 阅读 13296 | 点赞0
注:本节主要详细讲解线程同步的一些基本概念和GCD基础部分
GCD (Grand Central Dispatch)
首先我们来了解处理线程中的一些基本概念 :
系统同时提供给你好几个并发队列。它们叫做 全局调度队列(Global Dispatch Queues) 。目前的四个全局队列有着不同的优先级:background、low、default 以及 high。要知道,Apple 的 API 也会使用这些队列,所以你添加的任何任务都不会是这些队列中唯一的任务。
最后,你也可以创建自己的串行队列或并发队列。这就是说,至少有五个队列任你处置:主队列、四个全局调度队列,再加上任何你自己创建的队列。GCD 的“艺术”归结为选择合适的队列来调度函数以提交你的工作。
下面看下示例
Global Dispatch Queues
let back = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
let defual = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
let high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
let low = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(back) {
//后台执行
}
dispatch_async(defual) {
//后台执行
}
dispatch_async(low) {
//后台执行
}
dispatch_async(high) {
//后台执行
}
上面是全局后台执行的几种类型。可以设定级别
下面看看主线程。多用来刷新UI
dispatch_async(dispatch_get_main_queue()) {
//主线程执行
}
用户队列
let queue = dispatch_queue_create("myQueue", nil);
dispatch_async(queue) {
//后台执行
}
下面是延时执行
let time = NSEC_PER_SEC*3
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(time))
print(NSEC_PER_SEC)
dispatch_after(popTime,dispatch_get_main_queue()) {
//这里的内容在3秒后执行
print(2)
}
print(1)
这里NSEC_PER_SEC = 1000000000
先输出1 三秒后输出2
dispatch_once 在单例模式中很有用哦 , 不用if判断。加上这个就能保证 只执行一次了
func onlyOnce(){
struct Static {
static var onceToken : dispatch_once_t = 0
}
dispatch_once(&Static.onceToken) {
print("只会输出一次哦")
}
print("多次输出呀")
}
这里static变量保证用的是同一个token
onlyOnce()
onlyOnce()
onlyOnce()
onlyOnce()
onlyOnce()
然后我们多次调用 。
只会输出一次哦
多次输出呀
多次输出呀
多次输出呀
多次输出呀
多次输出呀
dispatch_once中的代码只执行了一次 。
以上就是今天总结的GCD基础部分 。下次总结下高级部分
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u010586842/article/details/48065669
内容来源于网络,如有侵权,请联系作者删除!