swift3多线程之GCD

多线程可以说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,共勉!

** 如果觉的本文有用的话,可以顺手点个喜欢!如有疑问,可以在下方留言! **

你可能感兴趣的:(swift3多线程之GCD)