Swift多线程开发 - 7. Operation 异步队列

在上一篇例子中我们实现的是Operation是同步的,本篇将着重介绍异步实现。

Operation的状态是完全由底层自动管理的只读属性,正常情况下,Operation在结束main函数的运行时就会把状态切换成isFinished
但是如果我们在Operationmain函数中执行了异步操作,Operation的自带机制就无法正常切换状态。main结束的时候我们的异步可能还在正常运行中。

AsyncOperation

为了方便读写任务状态,我们给AsyncOperation 重新写一个状态属性

Operation类的状态切换用的是KVO通知,所以我们给自定义的状态一个计算属性keyPath来匹配原基类的状


class AsyncOperation: Operation {
    // Create state management
    enum State: String {
        case ready, executing, finished
        fileprivate var keyPath: String {
            return "is\(rawValue.capitalized)"
        }
    }
    
    // Override properties
    var state = State.ready {
        willSet {
            willChangeValue(forKey: newValue.keyPath)
            willChangeValue(forKey: state.keyPath)
        } didSet {
            didChangeValue(forKey: oldValue.keyPath)
            didChangeValue(forKey: state.keyPath)
        }
    }
    
    override var isReady: Bool {
        return super.isReady && state == .ready // 一定要先检测isReady 因为它是受系统任务计划程序控制的
    }
    override var isExecuting: Bool {
        return state == .executing
    }
    override var isFinished: Bool {
        return state == .finished
    }
    override var isAsynchronous: Bool {
        return true
    }
    
    // Override start
    override func start() {
        // 官方文档说明在重写start()的时候不可以调用super
        if isCancelled {
            state = .finished
            return
        }

        main()
        state = .executing // 因为异步任务还在进行中
        
    }
 }   

使用

class ExampleAsyncOperation: AsyncOperation {
    
    override func main() {
        DispatchQueue.global().async {
            Thread.sleep(forTimeInterval: 2)
            self.state = .finished
        }
    }
    
}



作者博客地址

系列文章链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容