多线程可以说ios进阶高级程序员的必修课,swift2的时候GCD还是继承的OC中多线程的C API,在swift3之后为了适用swift的开发模式,所以对GCD进行了更改,详情可以参考Modernize libdispatch for Swift 3 naming conventions
本文主要介绍swift3.0下的多线程更改及使用,废话不多说,进入正题!
先看一下具体转换
** C type** | ** Swift type ** |
---|---|
dispatch_object_t | DispatchObject |
dispatch_queue_t | DispatchQueue |
dispatch_group_t | DispatchGroup |
dispatch_data_t | DispatchData |
dispatch_io_t | DispatchIO |
dispatch_semaphore_t | DispatchSemaphore |
dispatch_source_t | DispatchSource |
dispatch_time_t | DispatchTime, DispatchWalltime |
** 初始化几个对象,方便下文中使用 **
/// 创建队列
let queue = DispatchQueue.init(label: "com.test.myqueue")
/// 创建时间
let queueTime = DispatchTime.init(uptimeNanoseconds: UInt64.init(1))
/// 创建线程组
let groupQueue = DispatchGroup.init()
swift3中引入了DispatchWorkItem, 从名字差不多可以猜出来,这就是一个闭包,其内部还有几个方法
let item = DispatchWorkItem.init {
print("Hello World")
}
/// 等待
item.wait()
/// 取消
item.cancel()
/// 通知某个队列干活,使用这个方法时会使在queue队列中的item失效
item.notify(queue: queue) {
print("该干活了!")
}
正式开始!
1.DispatchQueue
- 在swift2之前开辟一个异步线程是这样的
dispatch_async(queue) {
print("Hello World")
}
swift3中已经正式弃用了!
现在我们要这样用
queue.async(execute: {
print("Hello World")
})
- 开辟同步线程
queue.sync {
print("Hello World")
}
- 合起来
DispatchQueue.init(label: "com.test.myqueue").async {
print("Hello World")
}
- 延时操作
/// 使用闭包或者DispatchWorkItem
queue.asyncAfter(deadline: queueTime) {
print("Hello world")
}
queue.asyncAfter(deadline: queueTime, execute: item)
等会,突然发现这个方法和我想的怎么不一样呢,233333,怎么办呀!
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
print("1s 后的世界")
})
2.DispatchGroup
group的使用方法与OC中几乎完全相同,下面一一来看一下:
- 将一个队列加入到gorup中
queue.async(group: groupQueue, execute: item)
或者
groupQueue.enter()
queue.async {
/// do what you want then leave
groupQueue.leave()
}
- 通知主线程刷新界面
groupQueue.notify(queue: DispatchQueue.main) {
/// 异步工作完成,可以放到主线程刷新UI了
}
总结
总体而言,OC中的cocoa部分在swift中差不多都有对应的方法,在GCD中也是同样的,但swift中对其进行了进一步优化,所以使用起来会感觉更加优雅,本文只是简单介绍了一下gcd的常用方法,在实际项目中往往要复杂的多,各位可以根据实际情况进行使用GCD,共勉!
** 如果觉的本文有用的话,可以顺手点个喜欢!如有疑问,可以在下方留言! **