美文网首页
Swift多线程开发 - 7. Operation 异步队列

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

作者: JaiUnChat | 来源:发表于2020-04-04 10:59 被阅读0次

在上一篇例子中我们实现的是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
        }
    }
    
}

作者博客地址

系列文章链接

相关文章

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

    在上一篇例子中我们实现的是Operation是同步的,本篇将着重介绍异步实现。 Operation的状态是完全由底...

  • iOS-Swift相关

    swift程序. 1.Swift多线程之Operation:异步加载CollectionView图片2.Swift...

  • Swift 5.x 多线程

    Swift多线程编程方案: Thread Cocoa Operation (Operation 和 Operati...

  • Swift多线程开发 - 6. Operation 队列

    Operation支持以下三种添加任务的方式 传Operation 传闭包 传Operation数组 Operat...

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • iOS开发多线程篇—GCD介绍(转)

    iOS开发多线程篇—GCD介绍 用异步函数往并发队列中添加任务--同时开启三个子线程 用异步函数往串行队列中添加任...

  • 前端异步的一些基本概念

    消息队列 settimeout是异步方法,会排到消息队列去执行,也就是执行异步方法的队列称为消息队列。 js多线程...

  • Swift - 简单的线程封装

    一、多线程开发-异步 创建一个新的swift文件,然后写上下面的代码 调用的时候: 二、多线程开发-延时 三、多线...

  • OS And iOS — GCD基础

    主观感受 我们在多线程开发中我们经常会遇到这些概念:并发队列、串行队列、同步任务、异步任务。将这两种队列和同步、异...

  • 七、GCD与多线程

    队列与任务的组合 在多线程开发中我们经常会遇到这些概念:并发队列、串行队列、同步任务、异步任务。我们将这四个概念进...

网友评论

      本文标题:Swift多线程开发 - 7. Operation 异步队列

      本文链接:https://www.haomeiwen.com/subject/jrpdphtx.html