测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年4月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✓ |
由 John Estropia 维护。
GCDKit 是使用 Swift 简化 Grand Central Dispatch 的库。
GCDKit 实现以下结构。要了解它们的工作原理,请直接跳转到下面 常见用法模式 部分。
GCDQueue
: 对 dispatch_queue_*
API 的抽象。因为通常我们只需要处理这些队列类型,所以 GCDQueue
表达为 enum
public 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 文件