Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class AsyncOperation: Operation {
- internal enum State {
- case pending, executing, finished
- }
- private var managedKeyPaths: [KeyPath<AsyncOperation, Bool>] {
- return [\AsyncOperation.isExecuting, \AsyncOperation.isFinished]
- }
- internal var state = State.pending {
- willSet { managedKeyPaths.forEach { willChangeValue(for: $0) } }
- didSet { managedKeyPaths.forEach { didChangeValue(for: $0) } }
- }
- override var isAsynchronous: Bool {
- return true
- }
- override var isExecuting: Bool {
- return state == .executing
- }
- override var isFinished: Bool {
- return state == .finished
- }
- }
- extension Operation {
- func cancelRecursively() {
- cancel()
- dependencies.forEach { $0.cancelRecursively() }
- }
- }
- extension Array where Element: Operation {
- func cancel() {
- self.forEach { $0.cancel() }
- }
- }
- extension ArraySlice where Element: Operation {
- func cancel() {
- self.forEach { $0.cancel() }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement