TSBaseOperationQueue.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // TSBaseOperationQueue.swift
  3. // AIRingtone
  4. //
  5. // Created by 100Years on 2025/3/20.
  6. //
  7. import Foundation
  8. import Combine
  9. class TSBaseOperationQueue {
  10. private(set) var queue: OperationQueue = OperationQueue()
  11. private var activeOperations:[String:TSBaseOperation] = [:]
  12. // 存储每个操作的 AnyCancellable
  13. private var cancellables: [String: AnyCancellable] = [:]
  14. // 存储 KVO 观察者
  15. private var operationCountObservation: NSKeyValueObservation?
  16. var isAvailability:Bool{
  17. if queue.operationCount < queue.maxConcurrentOperationCount {
  18. return true
  19. }
  20. return false
  21. }
  22. init(maxConcurrentOperationCount: Int = 1) {
  23. queue.maxConcurrentOperationCount = maxConcurrentOperationCount
  24. dePrint("TSBaseOperationQueue operationCountObservation")
  25. // 监听 operationCount 的变化
  26. operationCountObservation = queue.observe(\.operationCount, options: [.new]) { [weak self] (queue, change) in
  27. guard let self = self else { return }
  28. if let _ = change.newValue {
  29. NotificationCenter.default.post(name: .kBaseOperationQueueCountChanged, object: nil, userInfo: nil)
  30. }
  31. }
  32. }
  33. func creatOperation(uuid: String, type: TSBaseOperation.Type) -> TSBaseOperation {
  34. if let existingOperation = activeOperations[uuid] {
  35. return existingOperation
  36. } else {
  37. // 使用 type 参数创建操作
  38. let operation = type.init(uuid: uuid)
  39. activeOperations[uuid] = operation
  40. queue.addOperation(operation)
  41. dePrint("TSBaseOperationQueue addOperation \(operation)")
  42. cancellables[uuid] = operation.$operationStatePblished.sink { [weak self] state in
  43. guard let self = self else { return }
  44. switch state {
  45. case .finished(let finished):
  46. if finished == true {
  47. clearOperationsData(uuid: uuid)
  48. }
  49. case .cancelled(let cancelled):
  50. if cancelled == true {
  51. clearOperationsData(uuid: uuid)
  52. }
  53. default: break
  54. }
  55. dePrint("TSBaseOperationQueue $operationStatePblished =\(state)")
  56. }
  57. return operation
  58. }
  59. }
  60. func findOperation<T: TSBaseOperation>(uuid: String) -> T? {
  61. if let existingOperation = activeOperations[uuid] as? T {
  62. return existingOperation
  63. }
  64. return nil
  65. }
  66. /// 清理所有下载任务
  67. func cancelAllOperations() {
  68. queue.cancelAllOperations()
  69. activeOperations = [:]
  70. }
  71. /// 清理某个下载任务
  72. /// - Parameter url: 下载任务的 URL
  73. func cancelOperations(uuid: String) {
  74. if let operation = activeOperations[uuid] {
  75. operation.cancel()
  76. clearOperationsData(uuid: uuid)
  77. }
  78. }
  79. func clearOperationsData(uuid: String) {
  80. dePrint("TSBaseOperationQueue cancelOperations activeOperations 前=\(activeOperations)")
  81. dePrint("TSBaseOperationQueue cancelOperations cancellables 前=\(cancellables)")
  82. activeOperations.removeValue(forKey: uuid)
  83. cancellables.removeValue(forKey: uuid)
  84. dePrint("TSBaseOperationQueue cancelOperations activeOperations 后=\(activeOperations)")
  85. dePrint("TSBaseOperationQueue cancelOperations cancellables 后=\(cancellables)")
  86. }
  87. func waitUntilAllOperationsAreFinished() {
  88. queue.waitUntilAllOperationsAreFinished()
  89. }
  90. }