APNSubGroupOperationQueue 4.0.0

APNSubGroupOperationQueue 4.0.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
Released最后发布2019年4月
SPM支持SPM

André Pacheco Neves维护。



APNSubGroupOperationQueue

license release platforms Build Status codecov.io Docs Carthage CocoaPods Swift 4.2

Swift & Obj-C µ框架,由NSOperationQueue子类组成,允許在并发队列中对序列子组中的操作进行调度。

在某些情况下,在NSOperationQueue中安排的操作依赖于其他操作的子集,应按顺序处理,但不需要依赖队列中的剩余操作。

迄今为止,可以通过以下方法解决这个问题:

  • 为每个依赖于操作的子集使用单独的队列(可能变得难以管理,浪费资源)
  • 将队列定义为序列(性能不佳)

使用此µ框架,可以使用单个操作队列调度所有操作,并兼得两者之长。

依赖于操作的操作被分组到“子组”中,保证每个子组内部按序列方式处理,而来自其他子组的数据则并发处理(各自子组内序列)并且常规操作(即没有定义子组)与所有其他操作一起并发处理。这是通过利用NSOperation的依赖项并使用辅助数据结构来存储所有子组操作实现的。

使用

Swift

单子组键类型

@import APNSubGroupOperationQueue

let subGroupQueue = SubGroupOperationQueue<String>()

// schedule operations in subgroups "A", "B" and "C"
// these will run serially inside each subgroup, but concurrently with other subgroups' operations

subGroupQueue.addOperation(opA1, withKey: "A")
subGroupQueue.addOperation(opA2, withKey: "A")
subGroupQueue.addOperation(opA3, withKey: "A")

subGroupQueue.addOperations([opB1, opB2, opB3], withKey: "B")

subGroupQueue.addOperation({ /* opC1 */ }, withKey: "C")
subGroupQueue.addOperation({ /* opC2 */ }, withKey: "C")
subGroupQueue.addOperation({ /* opC3 */ }, withKey: "C")

// query current subgroup's operations (a snapshot)
let aOps = subGroupQueue["A"]
let bOps = subGroupQueue["B"]
let cOps = subGroupQueue.subGroupOperations(forKey: "C")

通过 AnyHashable 的多个子组键类型

@import APNSubGroupOperationQueue

let dynamicSubGroupQueue = SubGroupQueue<AnyHashable> // or simply a `DynamicSubGroupOperationQueue`

dynamicSubGroupQueue.addOperation(opX1, withKey: "X")
dynamicSubGroupQueue.addOperation(opX2, withKey: "X")
dynamicSubGroupQueue.addOperation(opX3, withKey: "X")

dynamicSubGroupQueue.addOperations([opN1, opN2, opN3], withKey: 1337)

let date = Date()
dynamicSubGroupQueue.addOperation({ /* opD1 */ }, withKey: date)
dynamicSubGroupQueue.addOperation({ /* opD2 */ }, withKey: date)
dynamicSubGroupQueue.addOperation({ /* opD3 */ }, withKey: date)

// query current subgroup's operations (a snapshot)
let xOps = subGroupQueue["X"]
let nOps = subGroupQueue[1337]
let dOps = subGroupQueue.subGroupOperations(forKey: date)

Objective-C

@import APNSubGroupOperationQueue;

APNSubGroupOperationQueue *subGroupQueue = [APNSubGroupOperationQueue new];

// schedule operations in subgroups "A", "B" and "C"
// these will run serially inside each subgroup, but concurrently with other subgroups' operations
[subGroupQueue addOperation:opA1 withKey:@"A"];
[subGroupQueue addOperation:opA2 withKey:@"A"];
[subGroupQueue addOperation:opA2 withKey:@"A"];

[subGroupQueue addOperations::@[opB1, opB2, opB3] withKey:@"B" waitUntilFinished:false];

[subGroupQueue addOperationWithBlock:^{ /* opC1 */ } andKey:@"C"];
[subGroupQueue addOperationWithBlock:^{ /* opC2 */ } andKey:@"C"];
[subGroupQueue addOperationWithBlock:^{ /* opC3 */ } andKey:@"C"];

// query current subgroup's operations (a snapshot)
NSArray<NSOperation*> *aOps = [subGroupQueue subGroupOperationsForKey:@"A"];
NSArray<NSOperation*> *bOps = [subGroupQueue subGroupOperationsForKey:@"B"];
NSArray<NSOperation*> *cOps = [subGroupQueue subGroupOperationsForKey:@"C"];

// Objective-C uses a `DynamicSubGroupOperationQueue` which allows a more flexible usage, since keys only need to be `NSObject`'s (`AnyHashable`)
[subGroupQueue addOperations:@[opN1, opN2, opN3] withKey:@1337 waitUntilFinished:false];

NSDate *date = [NSDate date];
[subGroupQueue addOperationWithBlock:^{ /* opD1 */ } andKey:date];
[subGroupQueue addOperationWithBlock:^{ /* opD2 */ } andKey:date];

兼容性

4.x(当前)

  • iOS 10.0+, macOS 10.12, tvOS 10.0+, watchOS 3.0+
  • Xcode 10.2+
  • Swift 5.0

3.x

  • iOS 10.0+, macOS 10.12, tvOS 10.0+, watchOS 3.0+
  • Xcode 10
  • Swift 4.2

2.x

  • iOS 8.0+, macOS 10.9+, tvOS 9.0+, watchOS 2.0+
  • 2.3.0
    • Xcode 9.4
    • Swift 4.1
  • 2.2.0
    • Xcode 9
    • Swift 4.0
  • 2.1.0
    • Xcode 8
    • Swift 3

集成

CocoaPods

将 APNSubGroupOperationQueue 添加到您的 Podfile 中并运行 pod install

# CocoaPods
pod 'APNSubGroupOperationQueue', '~> 4.0'

Carthage

将 APNSubGroupOperationQueue 添加到您的 Cartfile(包依赖)或 Cartfile.private(开发依赖)

github "p4checo/APNSubGroupOperationQueue" ~> 4.0

Swift 包管理器

将 APNSubGroupOperationQueue 添加到您的 Package.swift

import PackageDescription

let package = Package(
  name: "HelloWorld",
  dependencies: [
    .Package(url: "https://github.com/p4checo/APNSubGroupOperationQueue.git", majorVersion: 4),
  ]
)

git 子模块

  1. 将此存储库作为子模块添加。
  2. 将 APNSubGroupOperationQueue.xcodeproj 拖放到您的项目或工作区中。
  3. 将您的目标链接到平台上的 APNSubGroupOperationQueue.framework。
  4. 如果链接到应用程序目标,请确保框架被复制到捆绑包中。如果链接到框架目标,连接到它的应用程序也应包含 APNSubGroupOperationQueue。

贡献

参阅 贡献指南