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 ...
随机推荐
- Linux C 遍历指定目录
#include<stdio.h> //标准输入输出 #include<unistd.h> //各种系统调用 #include<dirent.h> //与目录有关的 ...
- Linux下C语言的调试--转
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- 再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题
相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则,经过查看org ...
- springboot jpa 多条件查询(多表)
前几天写的,贴上来. 实体类. package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /** * ...
- C# 枚举转字符串
有时候需要把枚举转字符串,那么如何把枚举转字符串? 枚举转字符串 假如需要把枚举转字符串,可以直接把他进行转换,请看代码 public enum Di { /// <summary> // ...
- div中让文字垂直居中
在div中如何让文字垂直居中? 作者在刚接触web前端开发时就遇到了这个问题,一直没有记录下来,今天正好有空,便记录下来. 为了方便展示,我把style先直接写在了div里. 效果如下图所示: 图1. ...
- CentOS6.8启动Tomcat无法访问
今天笔者在CentOS6.8的生产环境上配置Java环境,安装JDK,部署Tomcat,这本来是很简单的一件事,可是最后发现通过IP一直访问不了Tomcat的默认页面. 图1. 无法访问Tomcat默 ...
- [javaSE] 单例设计模式
四人帮设计了23中设计模式 单例设计模式:解决一个类在内存中只存在一个对象 构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取该对象 class Single{ private static ...
- 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)
这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...
- solr+tomcat整合
一.solr安装 http://archive.apache.org/dist/lucene/solr/ 这个地址有各个版本的 这次我使用的是5.5.4版本和tomcat8 版本5.5.4已经内置了j ...