iOS多线程操作:NSOperation

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)