美文网首页
iOS多线程操作:NSOperation

iOS多线程操作:NSOperation

作者: zevwings | 来源:发表于2019-07-21 12:08 被阅读0次

    Operation也是我们常见的多线程操作方式之一,在许多知名框架的多线程操作都是使用的Operation这种操作方式,我们来看看Operation的使用方式。

    Operation

    Operation在我们平常开发中是不可以直接拿来是用的,我们需要自定义一个类,继承自Operation,并实现main方法即可。

    class AsyncOperation: Operation {
        override func main() {
            for i in 0 ... 10 {
                print("operation 1 output \(i)")
                sleep(1)
            }
        }
    }
    
    let operation1 = AsyncOperation()
    // 添加任务结束闭包,当main方法执行完成后执行该闭包
    operation1.completionBlock = {
        print("operation1 执行完成了!")
    }
    // 启动线程
    operation1.start()
    

    当我们需要operation2operation1任务执行完成后执行,我们可以使用addDependency添加依赖,当前线程可以依赖多个线程,只需要多次调用addDependency即可

    operation2.addDependency(operation1)
    

    我们也可以设置线程的优先级,控制线程的执行优先级

    public enum QueuePriority : Int {
    
        case veryLow
    
        case low
    
        case normal
    
        case high
    
        case veryHigh
    }
    operation1.queuePriority = .high
    

    BlockOperation

    BlockOperation继承自Operation,帮我们实现了main方法,并可以使用闭包添加多个任务,但是每个闭包的执行是无序的。

    let operation2 = BlockOperation()
    // 添加任务闭包
    operation2.addExecutionBlock {
        for i in 10...20 {
            print("operation 2 block 1 \(i)")
            sleep(1)
        }
    }
    
    // 添加任务闭包
    operation2.addExecutionBlock {
        for i in 20...30 {
            print("operation 2 block 2 \(i)")
            sleep(1)
        }
    }
    
    // 添加任务闭包
    operation2.addExecutionBlock {
        for _ in 20...30 {
            print("-------------------")
            sleep(1)
        }
    }
    

    OperationQueue

    OperationQueue即线程操作队列,我们可以将线程添加到队列中执行,我们可以控制线程的执行数量和取消线程队列执行。

    let queue = OperationQueue()
    // 为队列添加名字,方便调试
    queue.name = "queue 1"
    // 添加线程1
    queue.addOperation(operation1)
    // 添加线程2
    queue.addOperation(operation2)
    

    当我们需要取消队列执行时使用cancle方法即可

    queue.cancle()
    

    我们可以控制队列的最大执行并发数量,使用maxConcurrentOperationCount控制并发数量,避免应用同一时间并发量太大导致应用消耗资源过大。

    queue.maxConcurrentOperationCount = 2
    

    Operation并不是只有文档中的这些方法,我们还可以控制和获取线程的状态等,这些可以参考官方文档。

    更好的阅读体验可以参考个人网站:https://zevwings.com

    相关文章

      网友评论

          本文标题:iOS多线程操作:NSOperation

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