APNSubGroupOperationQueue
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 子模块
- 将此存储库作为子模块添加。
- 将 APNSubGroupOperationQueue.xcodeproj 拖放到您的项目或工作区中。
- 将您的目标链接到平台上的 APNSubGroupOperationQueue.framework。
- 如果链接到应用程序目标,请确保框架被复制到捆绑包中。如果链接到框架目标,连接到它的应用程序也应包含 APNSubGroupOperationQueue。
贡献
参阅 贡献指南。