| 测试已测试 | ✓ |
| 语言语言 | SwiftSwift |
| 许可证 | MIT |
| 发布最后发布 | 2017年4月 |
| SwiftSwift 版本 | 3.0 |
| SPM支持 SPM | ✓ |
由 John Estropia 维护。
GCDKit 是使用 Swift 简化 Grand Central Dispatch 的库。
GCDKit 实现以下结构。要了解它们的工作原理,请直接跳转到下面 常见用法模式 部分。
GCDQueue: 对 dispatch_queue_* API 的抽象。因为通常我们只需要处理这些队列类型,所以 GCDQueue 表达为 enumpublic enum GCDQueue {
case Main
case UserInteractive
case UserInitiated
case Default
case Utility
case Background
case Custom(dispatch_queue_t) // serial or concurrent
}GCDBlock: 一个结构体,抽象了 iOS 8 中的新 dispatch_block_* API 家族。GCDGroup: 对 dispatch_group_* API 的抽象。GCDSemaphore: 对 dispatch_semaphore_* API 的抽象。以下是一些常见用例和如何使用 GCDKit 编写它们。
使用 iOS SDK
let mainQueue = dispatch_get_main_queue()
let defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let customSerialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL)
let customConcurrentQueue = dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT)使用 GCDKit
let mainQueue: GCDQueue = .Main
let defaultQueue: GCDQueue = .Default
let customSerialQueue: GCDQueue = .createSerial("mySerialQueue")
let customConcurrentQueue: GCDQueue = .createConcurrent("myConcurrentQueue")另外,使用 dispatch_queue_create(...) 创建的自定义队列通常目标是默认优先级的全局队列,除非您使用 dispatch_set_target_queue(...) API。例如,要使用当前 SDK 提高创建队列的优先级
let customConcurrentQueue = dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT)
dispatch_set_target_queue(customConcurrentQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0))使用 GCDKit,您可以在创建时立即指定目标队列
let customConcurrentQueue: GCDQueue = .createConcurrent("myConcurrentQueue", targetQueue: .UserInteractive)使用 iOS SDK
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// some heavy work...
dispatch_async(dispatch_get_main_queue()) {
// send results to UI
}
}使用 GCDKit,您可以从 GCDBlock.async(...) 启动一个任务链
GCDBlock.async(.Default) {
// some heavy work...
}.notify(.Main) {
// send results to UI
}或者直接从特定的 GCDQueue enum 值
GCDQueue.Default.async {
// some heavy work...
}.notify(.Main) {
// send results to UI
}您可以按照需要链式调用 .notify(...)
使用 iOS SDK
let dispatchGroup = dispatch_group_create()
dispatch_group_enter(dispatchGroup)
doSomeLongTaskWithCompletion {
dispatch_group_leave(dispatchGroup)
}
dispatch_group_async(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// do another long task
}
dispatch_group_async(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// do yet another long task
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue()) {
// report completion
}使用 GCDKit,您仍然可以使用常规的 enter()-leave() 对,并且可以链式调用到 dispatch group
let dispatchGroup = GCDGroup()
dispatchGroup.enter()
doSomeLongTaskWithCompletion {
dispatchGroup.leave()
}
dispatchGroup.async(.Default) {
// do another long task
}.async(.Default) {
// do yet another long task
}.notify(.Main) {
// report completion
}使用 iOS SDK
let numberOfIterations: UInt = 10
let semaphore = dispatch_semaphore_create(Int(numberOfIterations))
dispatch_apply(numberOfIterations, dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT)) {
(iteration: UInt) -> Void in
// do work for iteration
dispatch_semaphore_signal(semaphore)
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)使用 GCDKit
let numberOfIterations: UInt = 10
let semaphore = GCDSemaphore(numberOfIterations)
GCDQueue.createConcurrent("myConcurrentQueue").apply(numberOfIterations) {
(iteration: UInt) -> Void in
// do work for iteration
semaphore.signal()
}
semaphore.wait()请随时报告任何问题或发送建议!
GCDKit 在 MIT 许可证下发布。有关更多信息,请参阅 LICENSE 文件