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("都完成了")
        }
    }
}

细节


目录
相关文章
|
6月前
|
网络性能优化 API 调度
36 Swift多线程编程新思路:GCD
Swift多线程编程新思路:GCD
38 0
|
Swift
Swift - 自定义tabbar的封装
Swift - 自定义tabbar的封装
286 0
Swift - 自定义tabbar的封装
|
Swift
swift微博第7天(导航条按钮的封装)
swift微博第7天(导航条按钮的封装)
122 0
swift微博第7天(导航条按钮的封装)
|
JSON Go 数据格式
Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swift 自己的原生类型 URLSession,而不是NSURLSession。
910 0
|
JSON 数据格式 iOS开发
Swift学习第十枪-AFNetwoking3.0的封装
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51588829 下面是我的新建的Swift学习交流群,欢迎大家一起来共同学习Swift。
800 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
196 2

相关课程

更多