Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // AsyncOperation.swift
- // AsyncOperation
- //
- // Created by Vincent Esche on 4/7/15.
- // Copyright (c) 2015 Vincent Esche. All rights reserved.
- //
- import Foundation
- open class AsyncOperation: Operation {
- public enum State: String {
- case waiting = "isWaiting"
- case ready = "isReady"
- case executing = "isExecuting"
- case finished = "isFinished"
- case cancelled = "isCancelled"
- }
- open var state: State = State.waiting {
- willSet {
- willChangeValue(forKey: State.ready.rawValue)
- willChangeValue(forKey: State.executing.rawValue)
- willChangeValue(forKey: State.finished.rawValue)
- willChangeValue(forKey: State.cancelled.rawValue)
- }
- didSet {
- switch self.state {
- case .waiting:
- assert(oldValue == .waiting, "Invalid change from \(oldValue) to \(self.state)")
- case .ready:
- assert(oldValue == .waiting, "Invalid change from \(oldValue) to \(self.state)")
- case .executing:
- assert(
- oldValue == .ready || oldValue == .waiting,
- "Invalid change from \(oldValue) to \(self.state)"
- )
- case .finished:
- assert(oldValue != .cancelled, "Invalid change from \(oldValue) to \(self.state)")
- case .cancelled:
- break
- }
- didChangeValue(forKey: State.cancelled.rawValue)
- didChangeValue(forKey: State.finished.rawValue)
- didChangeValue(forKey: State.executing.rawValue)
- didChangeValue(forKey: State.ready.rawValue)
- }
- }
- open override var isReady: Bool {
- if self.state == .waiting {
- return super.isReady
- } else {
- return self.state == .ready
- }
- }
- open override var isExecuting: Bool {
- if self.state == .waiting {
- return super.isExecuting
- } else {
- return self.state == .executing
- }
- }
- open override var isFinished: Bool {
- if self.state == .waiting {
- return super.isFinished
- } else {
- return self.state == .finished
- }
- }
- open override var isCancelled: Bool {
- if self.state == .waiting {
- return super.isCancelled
- } else {
- return self.state == .cancelled
- }
- }
- open override var isAsynchronous: Bool {
- return true
- }
- }
- open class AsyncBlockOperation: AsyncOperation {
- public typealias Closure = (AsyncBlockOperation) -> ()
- let closure: Closure
- public init(closure: @escaping Closure) {
- self.closure = closure
- }
- open override func main() {
- guard !self.isCancelled else { return }
- self.closure(self)
- }
- }
Add Comment
Please, Sign In to add comment