iOS任务分配整理

时间:2021-01-06 05:17:33

思维导图

学过的东西不整理,就是一堆零散的物件,不仅增加大脑记忆的难度,也非常影响提取信息的速度。久了不用更是容易形成一些似是而非的概念。

iOS的任务分配是需要牢固掌握的东西,是时候好好整理一下了。

iOS任务分配整理

上图就是任务分配涉及到的几乎所有的东西了。

主要是

  1. 任务分配可以用两种api:
    • gcd: 更底层的分配方式
    • NSOperation: 封装过的,面向对象的
  2. queue有两种:
    • Serial: 这种queue中的任务FIFO.
      • UI在main_queue(dispatch_get_main_queue)中执行,是serial queue. 所以耗时的东西不要放这里。
    • Concurrency: 这种queue中的任务同时执行
      • 系统默认已有4个优先级(HIGH, DEFAULT, LOW, BACKGROUND)的任务, 可以用dispatch_get_global_queue获取。
  3. 如果是NSOperation,则只有Concurrency一种。
    • 如果要做成Serial的方式,可以添加dependency: operation2.addDependency(operation1)
  4. 取消任务:queue.cancelAllOperations
  5. 特殊需求:
    • 延时执行: dispatch_after
    • 只执行一次:dispatch_once
    • 任务分组:dispatch_group_async, dispatch_group_notify

代码

GCD

Concurrency

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) { () -> Void in
...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
...
})
}

Serial

let queue = dispatch_queue_create("imageSerialQueue", DISPATCH_QUEUE_SERIAL)
dispatch_async(queue) { () -> Void in
...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
...
})
}

NSOperation

NSOperationQueue

queue = NSOperationQueue()
queue.addOperationWithBlock { () -> Void in
...
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
...
})
}

NSBlockOperation

queue = NSOperationQueue()
let operation = NSBlockOperation { () -> Void in
...
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
...
})
}
operation.completionBlock = {
...
}
operation.addDependency(operation_another) //依赖
queue.addOperation(operation)

特殊需求

dispatch_once

var queue = NSOperationQueue() //global

dispatch_once(&oneToken) { () -> Void in
print("only once")
}

任务分组

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let group = dispatch_group_create()

dispatch_group_async(group, queue) { () -> Void in
//method1
}

dispatch_group_async(group, queue) { () -> Void in
//method2
}

dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
//complete method
}

参考:http://www.appcoda.com/ios-concurrency/