zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。