基本用法
多线程的最常见的目的就是
1.把耗时的计算操作放到子线程
2.通知主线程渲染UI
区别只在于是串行队列和并行队列,比如webImage,就是并行的,来了就通知子线程去处理然后调用不同的imageView显示出来,再比如数据库操作,那就还是串行的好,至少也要上锁保证读取安全
for i in 2...6000 {
DispatchQueue.global().async {
print(i)
DispatchQueue.main.async {
print(i,"main")
}
}
}
上述用法就是基本用法了,先是子线程,然后再套一个主线程去渲染UI神马的
DispatchWorkItem
这个好像是Swift自带的,OC没见过这东西
DispatchWorkItem本身是一个类,初始化方法有两个
而这个block实际是个() -> Void,而Void是()的别名,所以是一个无参也没返回值的闭包,而当函数里面只有一个闭包的时候
let item = DispatchWorkItem
{
print("123",Thread.current)
}
就可以用尾随闭包的方式写成上面这样
let item = DispatchWorkItem
{
print("123",Thread.current)
}
let mainItem = DispatchWorkItem
{
print("main",Thread.current) //main <NSThread: 0x600001e4c580>{number = 1, name = main}
}
DispatchQueue.global().async(execute: item)
DispatchQueue.main.async(execute: mainItem)
这个和普通的GCD用法没什么区别,但是在封装上面要方便,相对来说Swift更推荐这个方法
延迟执行
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 0.5, execute: item)
比如这段代码,就是延时0.5s执行
Once
fileprivate var INITTASK:Void =
{
let id = "123456"
//初始化操作
}()
这个括号里面的内容只会执行一次,把函数栈打印出来
其实本质还是dispatch_once