zoukankan      html  css  js  c++  java
  • swift版的GCD封装

    swift版的GCD封装

    说明

    本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利.

    源码

    https://github.com/YouXianMing/Swift-GCD

    //
    //  GCDQueue.swift
    //  GCD
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //  https://github.com/YouXianMing
    //
    //  Created by YouXianMing on 15/10/9.
    //
    
    import UIKit
    
    enum QueueType {
        
        case SerialQueue,     // 串行线程队列
             ConcurrentQueue, // 并发线程队列
             None             // 无类型
    }
    
    class GCDQueue: NSObject {
            
        // MARK: 变量
        var dispatchQueue : dispatch_queue_t!
        
        // MARK: 初始化
        override init() {
            
            super.init()
            dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)
        }
        
        init(queueType : QueueType) {
            
            super.init()
            
            switch queueType {
                
            case .SerialQueue:
                
                dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)
                break
                
            case .ConcurrentQueue:
                
                dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)
                break
                
            case .None:
                
                dispatchQueue = nil
                break
            }
        }
        
        // MARK: 单例
        static let mainQueue : GCDQueue = {
            
            let instance           = GCDQueue(queueType: .None)
            instance.dispatchQueue = dispatch_get_main_queue()
            
            return instance
            }()
        
        static let globalQueue : GCDQueue = {
            
            let instance           = GCDQueue(queueType: .None)
            instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
            
            return instance
            }()
        
        static let highPriorityGlobalQueue : GCDQueue = {
            
            let instance           = GCDQueue(queueType: .None)
            instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
            
            return instance
            }()
        
        static let lowPriorityGlobalQueue : GCDQueue = {
            
            let instance           = GCDQueue(queueType: .None)
            instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
            
            return instance
            }()
        
        static let backgroundPriorityGlobalQueue : GCDQueue = {
            
            let instance           = GCDQueue(queueType: .None)
            instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
            
            return instance
            }()
        
        // MARK: 执行
        
        /**
        Submits a block for asynchronous execution on a dispatch queue and returns immediately.
        
        - parameter block: dispatch block
        */
        func excute(block : dispatch_block_t) {
            
            dispatch_async(dispatchQueue, block)
        }
        
        func excute(block : dispatch_block_t, afterDelayWithNanoseconds : Int64) {
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, afterDelayWithNanoseconds), dispatchQueue, block)
        }
        
        /**
        Submits a block object for execution on a dispatch queue and waits until that block completes.
        
        - parameter block: dispatch block
        */
        func waitExecute(block : dispatch_block_t) {
            
            dispatch_sync(dispatchQueue, block)
        }
        
        /**
        Submits a barrier block for asynchronous execution and returns immediately.
        
        - parameter block: dispatch block
        */
        func barrierExecute(block : dispatch_block_t) {
            
            dispatch_barrier_async(dispatchQueue, block)
        }
        
        /**
        Submits a barrier block object for execution and waits until that block completes.
        
        - parameter block: dispatch block
        */
        func waitBarrierExecute(block : dispatch_block_t) {
            
            dispatch_barrier_sync(dispatchQueue, block)
        }
        
        // MARK: 便利构造器方法
        class func executeInMainQueue(block : dispatch_block_t) {
        
            dispatch_async(mainQueue.dispatchQueue, block)
        }
        
        class func executeInGlobalQueue(block : dispatch_block_t) {
            
            dispatch_async(globalQueue.dispatchQueue, block)
        }
        
        class func executeInHighPriorityGlobalQueue(block : dispatch_block_t) {
            
            dispatch_async(highPriorityGlobalQueue.dispatchQueue, block)
        }
        
        class func executeInLowPriorityGlobalQueue(block : dispatch_block_t) {
            
            dispatch_async(lowPriorityGlobalQueue.dispatchQueue, block)
        }
        
        class func executeInBackgroundPriorityGlobalQueue(block : dispatch_block_t) {
            
            dispatch_async(backgroundPriorityGlobalQueue.dispatchQueue, block)
        }
        
        class func executeInMainQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
            
            let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), mainQueue.dispatchQueue, block)
        }
        
        class func executeInGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
            
            let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), globalQueue.dispatchQueue, block)
        }
        
        class func executeInHighPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
            
            let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), highPriorityGlobalQueue.dispatchQueue, block)
        }
        
        class func executeInLowPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
            
            let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), lowPriorityGlobalQueue.dispatchQueue, block)
        }
        
        class func executeInBackgroundPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
            
            let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), backgroundPriorityGlobalQueue.dispatchQueue, block)
        }
        
        // MARK: 恢复与挂起
        func suspend() {
            
            dispatch_suspend(dispatchQueue)
        }
        
        func resume() {
            
            dispatch_resume(dispatchQueue)
        }
        
        
        // MARK: GCDGroup相关
        func excute(block : dispatch_block_t, inGroup : GCDGroup!) {
            
            dispatch_group_async(inGroup.dispatchGroup, dispatchQueue, block)
        }
        
        func notify(block : dispatch_block_t, inGroup : GCDGroup!) {
            
            dispatch_group_notify(inGroup.dispatchGroup, dispatchQueue, block)
        }
    }
    //
    //  GCDGroup.swift
    //  GCD
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //  https://github.com/YouXianMing
    //
    //  Created by YouXianMing on 15/10/9.
    //
    
    import UIKit
    
    class GCDGroup: NSObject {
    
        // MARK: 变量
        var dispatchGroup : dispatch_group_t!
        
        // MARK: 初始化
        override init() {
            
            super.init()
            dispatchGroup = dispatch_group_create()
        }
        
        // MARK: 操作
        func enter() {
        
            dispatch_group_enter(dispatchGroup)
        }
        
        func leave() {
        
            dispatch_group_leave(dispatchGroup)
        }
        
        func wait() {
        
            dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)
        }
        
        func waitWithNanoseconds(nanoseconds : Int64) -> Bool {
        
            return dispatch_group_wait(dispatchGroup, dispatch_time(DISPATCH_TIME_NOW, nanoseconds)) == 0
        }
    }
    //
    //  GCDTimer.swift
    //  GCD
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //  https://github.com/YouXianMing
    //
    //  Created by YouXianMing on 15/10/9.
    //
    
    import UIKit
    
    class GCDTimer: NSObject {
    
        // MARK: 变量
        var dispatchSource : dispatch_source_t!
        
        // MARK: 初始化
        override init() {
            
            super.init()
            dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
        }
        
        init(inQueue : GCDQueue) {
            
            super.init()
            self.dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, inQueue.dispatchQueue)
        }
        
        // MARK: 执行
        func event(block : dispatch_block_t, timeIntervalWithNanoseconds : UInt64) {
        
            dispatch_source_set_timer(dispatchSource, dispatch_time(DISPATCH_TIME_NOW, 0), timeIntervalWithNanoseconds, 0)
            
            dispatch_source_set_event_handler(dispatchSource) { () -> Void in
                
                block()
            }
        }
        
        func event(block : dispatch_block_t, timeIntervalWithSeconds : Double) {
            
            let timeInterval : UInt64 = UInt64(timeIntervalWithSeconds * Double(NSEC_PER_SEC))
            dispatch_source_set_timer(dispatchSource, dispatch_time(DISPATCH_TIME_NOW, 0), timeInterval, 0)
            dispatch_source_set_event_handler(dispatchSource) { () -> Void in
                
                block()
            }
        }
        
        func start() {
        
            dispatch_resume(dispatchSource)
        }
        
        func destroy() {
        
            dispatch_source_cancel(dispatchSource)
        }
    }
    //
    //  GCDSemaphore.swift
    //  GCD
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //  https://github.com/YouXianMing
    //
    //  Created by YouXianMing on 15/10/9.
    //
    
    import UIKit
    
    class GCDSemaphore: NSObject {
    
        // MARK: 变量
        var dispatchSemaphore : dispatch_semaphore_t!
        
        // MARK: 初始化
        override init() {
            
            super.init()
            dispatchSemaphore = dispatch_semaphore_create(0)
        }
        
        init(withValue : Int) {
            
            super.init()
            dispatchSemaphore = dispatch_semaphore_create(withValue)
        }
        
        // 执行
        func signal() -> Bool {
        
            return dispatch_semaphore_signal(dispatchSemaphore) != 0
        }
        
        func wait() {
        
            dispatch_semaphore_wait(dispatchSemaphore, DISPATCH_TIME_FOREVER)
        }
        
        func wait(withNanoseconds : Int64) -> Bool {
        
            return dispatch_semaphore_wait(dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW, withNanoseconds)) == 0
        }
    }
    //
    //  ViewController.swift
    //  GCD
    //
    //  Created by YouXianMing on 15/10/9.
    //  Copyright © 2015年 YouXianMing. All rights reserved.
    //
    
    import UIKit
    
    class ViewController: UIViewController {
        
        var queue     : GCDQueue!
        var group     : GCDGroup!
        var timer     : GCDTimer!
        var semaphore : GCDSemaphore!
        
        override func viewDidLoad() {
            
            super.viewDidLoad()
            
            timerUse()
        }
        
        // MARK: 各种用法
        
        /**
        普通用法
        */
        func normalUse() {
            
            GCDQueue.globalQueue.excute { () -> Void in
                
                // 子线程执行操作
                
                GCDQueue.mainQueue.excute({ () -> Void in
                    
                    // 主线程更新UI
                })
            }
            
            
            GCDQueue.executeInGlobalQueue { () -> Void in
                
                // 子线程执行操作
                
                GCDQueue.executeInMainQueue({ () -> Void in
                    
                    // 主线程更新UI
                })
            }
        }
        
        /**
        延时用法
        */
        func delayUse() {
            
            GCDQueue.executeInGlobalQueue({ () -> Void in
                
                // 延时 2s 执行
                
                }, afterDelaySeconds: 2)
        }
        
        func waitExecute() {
            
            queue = GCDQueue(queueType: .ConcurrentQueue)
            
            queue.waitExecute { () -> Void in
                
                print("1")
                sleep(1)
            }
            
            queue.waitExecute { () -> Void in
                
                print("2")
                sleep(1)
            }
            
            queue.waitExecute { () -> Void in
                
                print("3")
                sleep(1)
            }
            
            queue.waitExecute { () -> Void in
                
                print("4")
            }
        }
        
        /**
        设置屏障
        */
        func barrierExecute() {
            
            queue = GCDQueue(queueType: .ConcurrentQueue)
            
            queue.excute { () -> Void in
                
                print("1")
            }
            
            queue.excute { () -> Void in
                
                print("2")
            }
            
            queue.excute { () -> Void in
                
                print("3")
                sleep(1)
            }
            
            queue.barrierExecute { () -> Void in
                
                print("barrierExecute")
            }
            
            queue.excute { () -> Void in
                
                print("4")
            }
            
            queue.excute { () -> Void in
                
                print("5")
            }
            
            queue.excute { () -> Void in
                
                print("6")
            }
        }
        
        /**
        GCDGroup的使用
        */
        func groupUse() {
            
            group = GCDGroup()
            queue = GCDQueue()
            
            queue.excute({ () -> Void in
                
                print("1")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("2")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("3")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("4")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("5")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("6")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("7")
                
                }, inGroup: group)
            
            queue.excute({ () -> Void in
                
                print("8")
                
                }, inGroup: group)
            
            queue.notify({ () -> Void in
                
                print("都完成了")
                
                }, inGroup: group)
        }
        
        /**
        GCDTimer的使用
        */
        func timerUse() {
            
            timer = GCDTimer(inQueue: GCDQueue.globalQueue)
            timer.event({ () -> Void in
                
                print("timer event")
                
                }, timeIntervalWithSeconds: 1)
            timer.start()
        }
        
        /**
        GCD信号量的使用
        */
        func semaphoreUse() {
            
            semaphore = GCDSemaphore()
            queue     = GCDQueue(queueType: .ConcurrentQueue)
            
            queue.excute { () -> Void in
                
                print("1")
                self.semaphore.signal()
            }
            
            queue.excute { () -> Void in
                
                print("2")
                self.semaphore.signal()
            }
            
            queue.excute { () -> Void in
                
                print("3")
                self.semaphore.signal()
            }
            
            queue.excute { () -> Void in
                
                print("4")
                self.semaphore.signal()
            }
            
            queue.excute { () -> Void in
                
                self.semaphore.wait()
                self.semaphore.wait()
                self.semaphore.wait()
                self.semaphore.wait()
                
                print("都完成了")
            }
        }
    }

    细节

  • 相关阅读:
    Date类型转换成LocalDateTime 类型
    连接mysql数据库执行写入语句
    排序的的值为非数字时的处理方法
    git所遇到的问题
    visual studio快捷键
    Win10编译chromium
    下载chromium CIPD client失败的解决办法
    Linux内核源代码情景分析
    【赵强老师】史上最详细的PostgreSQL体系架构介绍
    3.Consul 安装配置(Proxysql+mgr)
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4864979.html
Copyright © 2011-2022 走看看