swift版的GCD封装
封装 swift gcd
2023-09-14 08:57:30 时间
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)
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
升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swift 自己的原生类型 URLSession,而不是NSURLSession。
iOS 仿支付宝银行卡界面(支持Swift/OC) 在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
相关文章
- iOS小技能:封装定位SDK,统一数据模型和错误处理。
- 前端项目(练手)+代码封装
- ffmpeg解析MP4封装的avc1编码问题「建议收藏」
- vue封装jquery修改自身以及兄弟元素的方法「建议收藏」
- C/C++ x32 Inline Hook 代码封装
- 2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包
- Go语言封装简介及实现细节
- SQL Server封装技术:打造高效能IT系统(sqlserver封装)
- 如何有效封装Redis以提高使用效率(怎么封装redis)
- 多模块封装,助力Redis更轻松部署(多模块封装redis)
- dmysql自己封装的mysql库
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- node爬取微博的数据的简单封装库nodeweibo使用指南