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, ) return instance
}() static let highPriorityGlobalQueue : GCDQueue = { let instance = GCDQueue(queueType: .None)
instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, ) return instance
}() static let lowPriorityGlobalQueue : GCDQueue = { let instance = GCDQueue(queueType: .None)
instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, ) return instance
}() static let backgroundPriorityGlobalQueue : GCDQueue = { let instance = GCDQueue(queueType: .None)
instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, ) 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)) ==
}
}
//
// 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, , , dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ))
} init(inQueue : GCDQueue) { super.init()
self.dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, , , inQueue.dispatchQueue)
} // MARK: 执行
func event(block : dispatch_block_t, timeIntervalWithNanoseconds : UInt64) { dispatch_source_set_timer(dispatchSource, dispatch_time(DISPATCH_TIME_NOW, ), timeIntervalWithNanoseconds, ) 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, ), timeInterval, )
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()
} init(withValue : Int) { super.init()
dispatchSemaphore = dispatch_semaphore_create(withValue)
} // 执行
func signal() -> Bool { return dispatch_semaphore_signal(dispatchSemaphore) !=
} 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)) ==
}
}
//
// 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: )
} func waitExecute() { queue = GCDQueue(queueType: .ConcurrentQueue) queue.waitExecute { () -> Void in print("")
sleep()
} queue.waitExecute { () -> Void in print("")
sleep()
} queue.waitExecute { () -> Void in print("")
sleep()
} queue.waitExecute { () -> Void in print("")
}
} /**
设置屏障
*/
func barrierExecute() { queue = GCDQueue(queueType: .ConcurrentQueue) queue.excute { () -> Void in print("")
} queue.excute { () -> Void in print("")
} queue.excute { () -> Void in print("")
sleep()
} queue.barrierExecute { () -> Void in print("barrierExecute")
} queue.excute { () -> Void in print("")
} queue.excute { () -> Void in print("")
} queue.excute { () -> Void in print("")
}
} /**
GCDGroup的使用
*/
func groupUse() { group = GCDGroup()
queue = GCDQueue() queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, inGroup: group) queue.excute({ () -> Void in print("") }, 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: )
timer.start()
} /**
GCD信号量的使用
*/
func semaphoreUse() { semaphore = GCDSemaphore()
queue = GCDQueue(queueType: .ConcurrentQueue) queue.excute { () -> Void in print("")
self.semaphore.signal()
} queue.excute { () -> Void in print("")
self.semaphore.signal()
} queue.excute { () -> Void in print("")
self.semaphore.signal()
} queue.excute { () -> Void in print("")
self.semaphore.signal()
} queue.excute { () -> Void in self.semaphore.wait()
self.semaphore.wait()
self.semaphore.wait()
self.semaphore.wait() print("都完成了")
}
}
}

细节

swift版的GCD封装的更多相关文章

  1. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  2. Swift版音乐播放器(简化版)

    这几天闲着也是闲着,学习一下Swift的.于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神. 希望对大家有帮助! 这个DEMO里.使用到了 AudioPlayer(对音 ...

  3. GCD封装的个人理解和应用

    GCD封装的个人理解和应用 特点 >>将GCD封装,使我们从繁琐的方法记忆中解脱出来,能够直接快速的应用. 使用方法 1.将工程中的GCD文件中的9个文件拖入自己的工程中(你自己最好建一个 ...

  4. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...

  5. 快速排序OC、Swift版源码

    前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...

  6. iOS可视化动态绘制八种排序过程(Swift版)

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  7. swift版的CircleView

    swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...

  8. swift版的StringAttribute

    swift版的StringAttribute 效果 源码 https://github.com/YouXianMing/Swift-StringAttribute // // StringAttrib ...

  9. swift版的元组

    swift版的元组 说明 元组的内容并不多,使用的话跟普通变量类似,以下是测试源码: // // ViewController.swift // Tuples // // Created by You ...

随机推荐

  1. Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)

    摘要:Linux下串口编程遇到的接收数据错误及原因 来源:https://dotblogs.com.tw/k/2012/07/24/73572 近日在调试串口的时候发现,另一设备向我ARM板的串口发送 ...

  2. PLSQL计算质数

    看到有人实现了一个计算质数的函数,就是效率有点差,贴一个以前写的计算质数的算法. 目标很简单,列出100以内的质数.其实算法很简单,两个循环就搞定了.但是发现使用不同的算法,执行效率差别之大相当惊人, ...

  3. Redis运行流程源码解析--转载

    http://blog.nosqlfan.com/html/4007.html http://www.searchdatabase.com.cn/showcontent_62166.htm 导读:本文 ...

  4. google tensorflow bert代码分析

    参考网上博客阅读了bert的代码,记个笔记.代码是 bert_modeling.py 参考的博客地址: https://blog.csdn.net/weixin_39470744/article/de ...

  5. MVC 基架不支持 Entity Framework 6 或更高版本 即 NuGet的几个小技巧

    MVC 基架不支持 Entity Framework 6 或更高版本.有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=276833. 原因:mvc版 ...

  6. 添加Access-Control-Allow-Origin主机头, 授权资源跨站访问

    时间 2014-09-24 22:02:48  All by Neil 原文  https://blog.byneil.com/添加access-control-allow-origin主机头-授权资 ...

  7. mybatis之@Select、@Insert、@Delete、@Param

    之前学习的时候,看到别人在使用mybatis时,用到@Select.@Insert.@Delete.@Param这几个注解,故楼主研究了一下,在这里与大家分享 当使用这几个注解的时候,可以省去写Map ...

  8. 照猫画虎owin oauth for qq and sina

    ms随vs2013推出了mvc5,mvc5自带的模板项目中引用了新的身份认证框架 ms identity.其中owin部分实现了google,facebook,twitter等国外常见的第三方用户.可 ...

  9. java SE 入门之八大内置基本类型(第二篇)

    本文采用eclipse 工具演示,如果您对eclipse 工具不了解,请先学习下 eclipse 工具的使用,这个里面只是简单的介绍下输出和注释: 安装完成eclipse 以后,双击进入 后一次点击 ...

  10. 由表生成代码:mybatis-generator入门

    application.properties ## mapper xml 文件地址 mybatis.mapper-locations=classpath*:mapper/*Mapper.xml ##数 ...