diff --git a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate index bd97902..5afed3d 100644 Binary files a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate and b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Podfile.lock b/Podfile.lock index 01d2bee..76624cc 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -254,7 +254,7 @@ PODS: - "DDCategoryKit_Private/UIImage+DDCategory" - Kingfisher - SnapKit - - DDTimerSwiftKit_Private (0.1.1): + - DDTimerSwiftKit_Private (0.1.3): - DDLogKit_Private/SwiftLog - DDToastKit_Private (0.1.2) - DDUtilsSwiftKit_Private (0.1.0): @@ -397,7 +397,7 @@ SPEC CHECKSUMS: DDMAMapKit_Private: fda2942ba7a3b7da4d440e59a89db9fd6708d842 DDNetworkingOfAlamofireKit_Private: d65c96f99bc59311d374e7b7a7e8a9e042d9b5ea DDProgressHUDKit_Private: 1e219062ddeb7801a4bb13b367efa1f3fbf17f1e - DDTimerSwiftKit_Private: ff34ed08c057588afa4e4337e0d08124c00dbcb3 + DDTimerSwiftKit_Private: e9c55d0d9d60de4965b369b342bb903c85542cff DDToastKit_Private: b6ae3709d110cadca503a037419f3709d1755256 DDUtilsSwiftKit_Private: a0bb323c6bac3bf68e94f95d10fd9e3529fb773d DDWebImageKit_Private: b905111547e44626773b729bae9030403a9a0c76 diff --git a/Pods/DDTimerSwiftKit_Private/DDTimerSwiftKit_Private/Classes/GCDTimer/GCDTimer.swift b/Pods/DDTimerSwiftKit_Private/DDTimerSwiftKit_Private/Classes/GCDTimer/GCDTimer.swift index 01cd235..34a4e5e 100644 --- a/Pods/DDTimerSwiftKit_Private/DDTimerSwiftKit_Private/Classes/GCDTimer/GCDTimer.swift +++ b/Pods/DDTimerSwiftKit_Private/DDTimerSwiftKit_Private/Classes/GCDTimer/GCDTimer.swift @@ -13,8 +13,10 @@ open class GCDTimer { private var timerSources : [GCDTimerAbstract] = [] - public var canceledCompletionHandler:(() -> Void)? // 主动取消定时器时,由于定时器当前可能存在任务,所以要等任务结束后再进行相应的操作 - + private var canceledCompletionHandler:(() -> Void)? // 主动取消定时器时,由于定时器当前可能存在任务,所以要等任务结束后再进行相应的操作 + + private var removeQueue = DispatchQueue(label: "GCDTimerRemoveQueue") // 移除定时器的时候,由于存在多个定时器同时移除的情况,定时器本身是异步操作的,所以从timerSources中移除GCDTimerAbstract的操作也是异步的,这就会导致数组在遍历的同时也在从数组中删除项目,会有问题,所以把删除的操作放在同步队列中 + /// 取消定时器时,定时器如果有正在执行的任务,会先将当前正在执行的任务执行完成才会取消成功,因此如果需要添加相同名字的定时器,需要确保之前同名的定时器已经被彻底取消了。 /// - Parameters: /// - named: 定时器名字 @@ -37,22 +39,24 @@ open class GCDTimer { repeatHandler() } cancelHandler: {[weak self] timerName in // 移除定时器 - self?.removeGCDTimer(named: timerName) - // 添加定时器处执行取消操作 - if let cancelHandler { - cancelHandler() - } - // 取消定时器处执行取消操作 - if let canceledCompletionHandler = self?.canceledCompletionHandler { - canceledCompletionHandler() - } + self?.removeGCDTimer(named: timerName,removeComletionHandler: {[weak self] in + // 添加定时器处执行取消操作 + if let cancelHandler { + cancelHandler() + } + // 取消定时器处执行取消操作 + if let canceledCompletionHandler = self?.canceledCompletionHandler { + canceledCompletionHandler() + } + }) } completionHandler: {[weak self] timerName in // 移除定时器 - self?.removeGCDTimer(named: timerName) - // 执行结束操作 - if let completionHandler { - completionHandler() - } + self?.removeGCDTimer(named: timerName,removeComletionHandler: { + // 执行结束操作 + if let completionHandler { + completionHandler() + } + }) } timerSources.append(gcdTimerA) @@ -67,14 +71,19 @@ open class GCDTimer { /// - timerName: 定时器名字 /// - canceledCompletionHandler: 取消定时器后的操作 public func cancelGCDTimer(named timerName:String,canceledCompletionHandler:(() -> Void)? = nil) { + self.canceledCompletionHandler = canceledCompletionHandler + // 当timerSources中包含定时器时,取消定时器 if let gcdTimerA = timerSources.first(where: { gcdTimerA in gcdTimerA.timerName == timerName }) { - self.canceledCompletionHandler = canceledCompletionHandler gcdTimerA.cancelGCDTimer(isCanceledManually: true) }else{ - DDLog(message: "定时器\'\(timerName)\'取消失败,未包含") + if let canceledCompletionHandler { + canceledCompletionHandler() + } + // 打印剩余的定时器 + logTimerName() } } @@ -87,20 +96,27 @@ open class GCDTimer { return false } - func removeGCDTimer(named timerName:String) { - // 移除定时器的抽象类 - timerSources.removeAll { gcdTimerA in - gcdTimerA.timerName == timerName + func removeGCDTimer(named timerName:String,removeComletionHandler:@escaping () -> Void) { + removeQueue.sync {[weak self] in + // 移除定时器的抽象类 + if let index = self?.timerSources.firstIndex(where: { gcdTimerA in + gcdTimerA.timerName == timerName + }) { + self?.timerSources.remove(at: index) + DDLog(message: "定时器\'\(timerName)\'移除成功") + } + // 打印剩余的定时器 + self?.logTimerName() } - DDLog(message: "定时器\'\(timerName)\'移除成功") - // 打印剩余的定时器 - logTimerName() } func logTimerName() { + var array : [String] = [] for gcdTimerA in timerSources { - DDLog(message:("剩余定时器:\'\( gcdTimerA.timerName)\'")) + array.append(gcdTimerA.timerName) } + DDLog(message:("剩余定时器:\'\(array)\'")) + array.removeAll() } } @@ -137,8 +153,6 @@ class GCDTimerAbstract { if let cancelHandler,let timerName = self?.timerName { cancelHandler(timerName) } - - // 定时器中途被取消时,在取消完成后 }else{ // 定时器结束后执行 if let completionHandler,let timerName = self?.timerName { diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 01d2bee..76624cc 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -254,7 +254,7 @@ PODS: - "DDCategoryKit_Private/UIImage+DDCategory" - Kingfisher - SnapKit - - DDTimerSwiftKit_Private (0.1.1): + - DDTimerSwiftKit_Private (0.1.3): - DDLogKit_Private/SwiftLog - DDToastKit_Private (0.1.2) - DDUtilsSwiftKit_Private (0.1.0): @@ -397,7 +397,7 @@ SPEC CHECKSUMS: DDMAMapKit_Private: fda2942ba7a3b7da4d440e59a89db9fd6708d842 DDNetworkingOfAlamofireKit_Private: d65c96f99bc59311d374e7b7a7e8a9e042d9b5ea DDProgressHUDKit_Private: 1e219062ddeb7801a4bb13b367efa1f3fbf17f1e - DDTimerSwiftKit_Private: ff34ed08c057588afa4e4337e0d08124c00dbcb3 + DDTimerSwiftKit_Private: e9c55d0d9d60de4965b369b342bb903c85542cff DDToastKit_Private: b6ae3709d110cadca503a037419f3709d1755256 DDUtilsSwiftKit_Private: a0bb323c6bac3bf68e94f95d10fd9e3529fb773d DDWebImageKit_Private: b905111547e44626773b729bae9030403a9a0c76