TSGenerateBaseOperation.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // TSGenerateBaseOperation.swift
  3. // AIRingtone
  4. //
  5. // Created by 100Years on 2025/3/24.
  6. //
  7. import Combine
  8. import Alamofire
  9. class TSGenerateBaseOperationQueue: TSBaseOperationQueue {
  10. // 存储每个操作的 AnyCancellable
  11. var stateables: [String: AnyCancellable] = [:]
  12. var generateOperationStateChanged:((String)->Void)?
  13. override func cancelOperations(uuid: String) {
  14. super.cancelOperations(uuid: uuid)
  15. stateables.removeValue(forKey: uuid)
  16. }
  17. func handleStateDatauPblished(uuid:String,generateOperation: TSGenerateBaseOperation,notificationName:Notification.Name) {
  18. stateables[uuid] = generateOperation.$stateDatauPblished.sink { [weak self] state in
  19. guard let self = self else { return }
  20. DispatchQueue.main.async {
  21. self.generateOperationStateChanged?(uuid)
  22. let uuidData = self.getUUIDData(uuid: uuid)
  23. NotificationCenter.default.post(
  24. name: notificationName,
  25. object: nil,
  26. userInfo: [
  27. "uuid": uuid,
  28. "count":self.queue.maxConcurrentOperationCount,
  29. "state":uuidData.0,
  30. "actionInfo":uuidData.1,
  31. ])
  32. }
  33. }
  34. }
  35. func getUUIDData(uuid:String)->(TSProgressState,TSActionInfoModel?){
  36. return (.none,TSActionInfoModel())
  37. }
  38. }
  39. class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
  40. var actionInfoDict:[String:Any]{
  41. return [:]
  42. }
  43. @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil){
  44. didSet{
  45. dePrint("TSBaseOperation stateDatauPblished didSet = \(stateDatauPblished)")
  46. if case .start = stateDatauPblished.0 {
  47. start()
  48. }else if stateDatauPblished.0.isResult {
  49. finished()
  50. }
  51. }
  52. }
  53. var creatRequest:Request?
  54. var queryRequest:Request?
  55. var stopNetwork = false
  56. var generatingProgress = 0
  57. var action_id:Int = 0
  58. var currentActionInfoModelChanged:((TSActionInfoModel)->Void)?
  59. @Published var currentActionInfoModel: TSActionInfoModel = TSActionInfoModel()
  60. func getActionInfo(action_id:Int){
  61. self.action_id = action_id
  62. queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
  63. guard let self = self else { return }
  64. if let result = kNetWorkResultSuccess(data: data) {
  65. if let genmojiModel = TSActionInfoModel(JSON: result) {
  66. switch genmojiModel.actionStatus {
  67. case .success:
  68. TSToastShared.hideLoading()
  69. self.stateDatauPblished = (.success(nil),genmojiModel)
  70. generatingProgress = 0
  71. case .failed:
  72. self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
  73. generatingProgress = 0
  74. default:
  75. stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
  76. if stopNetwork == false {
  77. kDelayOnMainThread(1.0) {
  78. self.getActionInfo(action_id: action_id)
  79. }
  80. }
  81. }
  82. }
  83. }else{
  84. self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
  85. }
  86. }
  87. }
  88. func generating(progress:Float) -> String {
  89. //Generating 0%-100%
  90. var progressInt = Int(progress*100)
  91. if generatingProgress >= progressInt{
  92. return getGeneratingProgressText()
  93. }
  94. if progressInt > 99 {
  95. progressInt = 99
  96. }
  97. generatingProgress = progressInt
  98. return getGeneratingProgressText()
  99. }
  100. func getGeneratingProgressText()->String{
  101. return "Generating \(generatingProgress)%"
  102. }
  103. func cancelAllRequest(){
  104. creatRequest?.cancel()
  105. queryRequest?.cancel()
  106. stopNetwork = true
  107. cancel()
  108. }
  109. }
  110. var kRandomBoolLastResult:Bool = true
  111. func kRandomBool() -> Bool {
  112. if !kRandomBoolLastResult {
  113. // 如果上一次是 false,这次必须返回 true
  114. kRandomBoolLastResult = true
  115. return true
  116. } else {
  117. // 如果上一次是 true,随机返回 true 或 false
  118. let randomResult = Bool.random()
  119. kRandomBoolLastResult = randomResult
  120. return randomResult
  121. }
  122. }