思维导图
学过的东西不整理,就是一堆零散的物件,不仅增加大脑记忆的难度,也非常影响提取信息的速度。久了不用更是容易形成一些似是而非的概念。
iOS的任务分配是需要牢固掌握的东西,是时候好好整理一下了。
上图就是任务分配涉及到的几乎所有的东西了。
主要是:
- 任务分配可以用两种api:
- gcd: 更底层的分配方式
- NSOperation: 封装过的,面向对象的
- queue有两种:
-
Serial: 这种queue中的任务FIFO.
- UI在main_queue(dispatch_get_main_queue)中执行,是serial queue. 所以耗时的东西不要放这里。
-
Concurrency: 这种queue中的任务同时执行
- 系统默认已有4个优先级(HIGH, DEFAULT, LOW, BACKGROUND)的任务, 可以用
dispatch_get_global_queue
获取。
- 系统默认已有4个优先级(HIGH, DEFAULT, LOW, BACKGROUND)的任务, 可以用
-
Serial: 这种queue中的任务FIFO.
- 如果是NSOperation,则只有Concurrency一种。
- 如果要做成Serial的方式,可以添加dependency: operation2.addDependency(operation1)
- 取消任务:queue.cancelAllOperations
- 特殊需求:
- 延时执行: 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
}