Guest User

Untitled

a guest
Jan 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. //
  2. // AsyncOperation.swift
  3. // AsyncOperation
  4. //
  5. // Created by Vincent Esche on 4/7/15.
  6. // Copyright (c) 2015 Vincent Esche. All rights reserved.
  7. //
  8. import Foundation
  9.  
  10. open class AsyncOperation: Operation {
  11. public enum State: String {
  12. case waiting = "isWaiting"
  13. case ready = "isReady"
  14. case executing = "isExecuting"
  15. case finished = "isFinished"
  16. case cancelled = "isCancelled"
  17. }
  18.  
  19. open var state: State = State.waiting {
  20. willSet {
  21. willChangeValue(forKey: State.ready.rawValue)
  22. willChangeValue(forKey: State.executing.rawValue)
  23. willChangeValue(forKey: State.finished.rawValue)
  24. willChangeValue(forKey: State.cancelled.rawValue)
  25. }
  26. didSet {
  27. switch self.state {
  28. case .waiting:
  29. assert(oldValue == .waiting, "Invalid change from \(oldValue) to \(self.state)")
  30. case .ready:
  31. assert(oldValue == .waiting, "Invalid change from \(oldValue) to \(self.state)")
  32. case .executing:
  33. assert(
  34. oldValue == .ready || oldValue == .waiting,
  35. "Invalid change from \(oldValue) to \(self.state)"
  36. )
  37. case .finished:
  38. assert(oldValue != .cancelled, "Invalid change from \(oldValue) to \(self.state)")
  39. case .cancelled:
  40. break
  41. }
  42.  
  43. didChangeValue(forKey: State.cancelled.rawValue)
  44. didChangeValue(forKey: State.finished.rawValue)
  45. didChangeValue(forKey: State.executing.rawValue)
  46. didChangeValue(forKey: State.ready.rawValue)
  47. }
  48. }
  49.  
  50. open override var isReady: Bool {
  51. if self.state == .waiting {
  52. return super.isReady
  53. } else {
  54. return self.state == .ready
  55. }
  56. }
  57.  
  58. open override var isExecuting: Bool {
  59. if self.state == .waiting {
  60. return super.isExecuting
  61. } else {
  62. return self.state == .executing
  63. }
  64. }
  65.  
  66. open override var isFinished: Bool {
  67. if self.state == .waiting {
  68. return super.isFinished
  69. } else {
  70. return self.state == .finished
  71. }
  72. }
  73.  
  74. open override var isCancelled: Bool {
  75. if self.state == .waiting {
  76. return super.isCancelled
  77. } else {
  78. return self.state == .cancelled
  79. }
  80. }
  81.  
  82. open override var isAsynchronous: Bool {
  83. return true
  84. }
  85. }
  86.  
  87. open class AsyncBlockOperation: AsyncOperation {
  88. public typealias Closure = (AsyncBlockOperation) -> ()
  89.  
  90. let closure: Closure
  91.  
  92. public init(closure: @escaping Closure) {
  93. self.closure = closure
  94. }
  95.  
  96. open override func main() {
  97. guard !self.isCancelled else { return }
  98.  
  99. self.closure(self)
  100. }
  101. }
Add Comment
Please, Sign In to add comment