123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import UIKit
- import JGProgressHUD
- class ParallelWorker {
- let completionGroup = DispatchGroup()
- let queue = DispatchQueue(label: "ParallelWorker")
- let semaphore: DispatchSemaphore
- let titleKey: String
- var hud: JGProgressHUD?
- var totalTasks: Int?
- var completedTasks = 0
- var isCancelled = false
-
-
-
-
-
-
- init(n: Int, titleKey: String?, totalTasks: Int?, hudView: UIView?) {
- semaphore = DispatchSemaphore(value: n)
- self.totalTasks = totalTasks
- self.titleKey = titleKey ?? "_wait_"
- guard let hudView = hudView else { return }
- DispatchQueue.main.async {
- let hud = JGProgressHUD()
- hud.show(in: hudView)
- hud.textLabel.text = NSLocalizedString(self.titleKey, comment: "")
- hud.detailTextLabel.text = NSLocalizedString("_tap_to_cancel_", comment: "")
- hud.tapOnHUDViewBlock = { hud in
- self.isCancelled = true
- hud.dismiss()
- }
- self.hud = hud
- }
- }
-
-
- func execute(task: @escaping (_ completion: @escaping () -> Void) -> Void) {
- completionGroup.enter()
- queue.async {
- self.semaphore.wait()
- guard !self.isCancelled else { return self.completionGroup.leave() }
- task {
- self.completedTasks += 1
- DispatchQueue.main.async {
- self.hud?.textLabel.text = "\(NSLocalizedString(self.titleKey, comment: "")) \(self.completedTasks) "
- if let totalTasks = self.totalTasks {
- self.hud?.textLabel.text?.append("\(NSLocalizedString("_of_", comment: "")) \(totalTasks)")
- } else {
- self.hud?.textLabel.text?.append(NSLocalizedString("_files_", comment: ""))
- }
- }
- self.semaphore.signal()
- self.completionGroup.leave()
- }
- }
- }
-
-
- func completeWork(completion: (() -> Void)? = nil) {
- completionGroup.notify(queue: .main) {
- guard !self.isCancelled else { return }
- self.hud?.indicatorView = JGProgressHUDSuccessIndicatorView()
- self.hud?.textLabel.text = NSLocalizedString("_done_", comment: "")
- self.hud?.detailTextLabel.text = ""
- self.hud?.dismiss(afterDelay: 1)
- completion?()
- }
- }
- }
|