GCD,单例

2019-11-01  本文已影响0人  高乔人

由于swift3.0 中已经删除了dispatch_one 这种OC 中的写法,至于为什么 ? 因为 static var背后已经在使用dispatch_once了,所以从Swift 3.0开始,就干脆把dispatch_once显式的取消了。

1.至于swift中的单例应该怎么写呢,我这里大胆分享其中一种

 final class myInstance: NSObject {
   static let shared = myInstance()
   private override init() {}
}

2.如果一大堆任务执行着的时候,突然后面的任务不想执行的。那怎么办呐?我们可以让它暂时先挂起,等想好了再让它们运行起来。

func useDispatchSuspend(_ sender: Any) {
   let queue = DispatchQueue(label: "new thread")
   //        挂起
   queue.suspend()
   
   queue.async {
       print("The queue is suspended. Now it has completed.\n The queue is \"\(queue.label)\". ")
   }
   
   print("The thread will sleep for 3 seconds' time")
   
   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(3)) {
       //            唤醒,开始执行
       queue.resume()
   }
}

3.信号量

//创建一个信号量,初始值为1
let semaphoreSignal = DispatchSemaphore(value: 1)

//表示信号量-1
semaphoreSignal.wait()  

//表示信号量+1
semaphoreSignal.signal()


func useSemaphore(_ sender: Any) {
   let semaphoreSignal = DispatchSemaphore(value: 1)
   
   for index in 1...5 {
       DispatchQueue.global().async {
           semaphoreSignal.wait()
           print(Thread.current)
           print("这是第\(index)次执行.\n")
           semaphoreSignal.signal()
       }
       print("测试打印")
       
   }
   
}

4.多个线程之间进行任务协调

semaphoreDemo() -> Void {
   let sema = DispatchSemaphore.init(value: 0)
   getListData { (result) in
       if result == true {
           sema.signal()
       }
   }
   sema.wait()
   print("我终于可以开始干活了")
}

private func getListData(isFinish:@escaping (Bool) -> ()) {
   
   DispatchQueue.global().async {
       Thread.sleep(forTimeInterval: 1)
       print("global queue has completed!")
       isFinish(true)
   }
   
}
  1. 任务组
 /1.自动关联
@IBAction func useGroupQueue(_ sender: UIButton) {
   let group = DispatchGroup()
   //模拟循环建立几个全局队列
   for index in 0...3 {

//创建队列的同时,加入到任务组中        
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
           Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
           print("任务\(index)执行完毕")
       }))
   }
   
   //组中所有任务都执行完了会发送通知
   group.notify(queue: DispatchQueue.main) {
       print("任务组的任务都已经执行完毕啦!")
   }
   
   
   print("打印测试一下")
} 

/2.手动关联

 enter(),leave()是一对儿。前者表示进入到任务组。后者表示离开任务组。
 let manualGroup = DispatchGroup()
//模拟循环建立几个全局队列
for manualIndex in 0...3 {
   
   //进入队列管理
   manualGroup.enter()
   DispatchQueue.global().async {
       //让线程随机休息几秒钟
       Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
       print("-----手动任务\(manualIndex)执行完毕")
       
       //配置完队列之后,离开队列管理
       manualGroup.leave()
   }
}

//发送通知
manualGroup.notify(queue: DispatchQueue.main) {
   print("手动任务组的任务都已经执行完毕啦!")
}
上一篇下一篇

猜你喜欢

热点阅读