美文网首页
GCD,单例

GCD,单例

作者: 高乔人 | 来源:发表于2019-11-01 15:39 被阅读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("手动任务组的任务都已经执行完毕啦!")
    }
    

    相关文章

      网友评论

          本文标题:GCD,单例

          本文链接:https://www.haomeiwen.com/subject/maofbctx.html