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, ) 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封装的更多相关文章
- Swift版音乐播放器(简化版),swift音乐播放器
这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...
- Swift版音乐播放器(简化版)
这几天闲着也是闲着,学习一下Swift的.于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神. 希望对大家有帮助! 这个DEMO里.使用到了 AudioPlayer(对音 ...
- GCD封装的个人理解和应用
GCD封装的个人理解和应用 特点 >>将GCD封装,使我们从繁琐的方法记忆中解脱出来,能够直接快速的应用. 使用方法 1.将工程中的GCD文件中的9个文件拖入自己的工程中(你自己最好建一个 ...
- Swift版iOS游戏框架Sprite Kit基础教程下册
Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...
- 快速排序OC、Swift版源码
前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...
- iOS可视化动态绘制八种排序过程(Swift版)
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- swift版的CircleView
swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...
- swift版的StringAttribute
swift版的StringAttribute 效果 源码 https://github.com/YouXianMing/Swift-StringAttribute // // StringAttrib ...
- swift版的元组
swift版的元组 说明 元组的内容并不多,使用的话跟普通变量类似,以下是测试源码: // // ViewController.swift // Tuples // // Created by You ...
随机推荐
- CART树
算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法. 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的 ...
- Pelican+Github博客搭建详细教程
操作系统:Mac OS / Linux 工具集: 1.Pelican--基于Python的静态网页生成器 2.马克飞象--Evernote出的Markdown文本编辑器 3.GoDaddy--域名供应 ...
- java 拦截器、过滤器、监听器
一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...
- SSH和SSL比较
一.SSH介绍 什么是SSH? 传统的网络服务程序,如:ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据, 别有用心的人非常容易就可以截 获这些口令和数据.而且, ...
- SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)
软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...
- 【转】CSS3的calc()使用——精缩版
问题:在制作页面的时候,总会碰到有的元素是100%的宽度.如果元素宽度是100%时,只要在元素中添加了border,padding,margin任何一值,都将会把元素盒子撑破(标准模式下,除IE怪异模 ...
- Socket编程 - API
基础知识部分:http://www.cnblogs.com/Jimmy1988/p/7839940.html 1. 基本流程 Process Client Server Comment socket( ...
- 阿里云centos6.5实践编译安装LNMP架构web环境
LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. 本次测试需求: **实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 ngx_pa ...
- MySQL填坑系列--Linux平台下MySQL区分大小写问题
大家好,我是软件大盗(道),下面开始我们的<MySQL填坑系列>. 笔者最近又在MySQL的边缘试探,然后,试探着,试探着就报错了. 书接上文,系统连接数据库时报错:找不到DB_TIMIN ...
- automapper 自动映射 集成asp.net Core2.1
学习博文:https://www.cnblogs.com/yan7/p/8085410.html 1.使用nuget 安装 <PackageReference Include="Aut ...