GCDKit 2.1.0

GCDKit 2.1.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年4月
SwiftSwift 版本3.0
SPM支持 SPM

John Estropia 维护。



GCDKit 2.1.0

  • John Rommel Estropia

GCDKit

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 文件