首先让我看一下API
Dispatch是一个通过简单但强大的API表达并发性的抽象模型。
在核心,调度提供可以提交块的串行FIFO队列。提交到这些调度队列的块在池上被调用
的线程完全由系统管理。不保证
将调用哪个线程的块;然而,保证只有一个提交到FIFO调度队列的块将被一次调用。当多个队列具有要处理的块时,系统可以自由地
分配附加线程以并发调用块。当队列变为空时,这些线程会自动释放。
抽象
调度队列按FIFO顺序调用提交给它们的块。队列每次只调用一个块,但是独立的队列可以各自相对于彼此同时调用它们的块。
讨论
调度队列是可以提交块的轻量级对象。
系统管理一个线程池,它处理调度队列并调用提交给它们的块。
在概念上,调度队列可以具有其自己的执行线程,并且队列之间的交互是高度异步的。
调度队列通过调用dispatch_retain()和dispatch_release()来引用计数。提交到队列的挂起块还保存对队列的引用,直到它们完成。一旦对一个队列的所有引用被释放,该队列将被系统释放。
FIFO 是 first in first out 先进先出 dispatch queue 就是调度队列, block就是块,很形象.
首先要创建一个队列,三种方式
1.dispatch_get_main_queue() 主队列,不必多说
2.dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>) 这个比较常用,全局队列,为系统为我们开启的一些全局线程。第一个参数是设置优先级,而flag作为保留字段备用(一般为0)。
优先级是一下四个等级
DISPATCH_QUEUE_PRIORITY_HIGH
分派到队列的项将以高优先级运行,即队列将被调度为在任何默认优先级或低优先级队列之前执行。
DISPATCH_QUEUE_PRIORITY_DEFAULT
分派到队列的项目将以默认优先级运行,即队列将在所有高优先级队列被调度之后但在任何低优先级队列被调度之前被调度执行。
DISPATCH_QUEUE_PRIORITY_LOW
分配到队列的项目将以低优先级运行,在所有默认优先级和高优先级队列都被调度之后,队列将被调度执行。
DISPATCH_QUEUE_PRIORITY_BACKGROUND
分派到队列的项目将以后台优先级运行,即队列将被调度以在所有较高优先级队列被调度之行执行
,并且系统将在具有根据设置优先级(2)的后台状态的线程上在该队列上运行项目,(磁盘I / O
被节制,并且线程的调度优先级设置为最低值)。
第一个线程名称,选填,本事天空的第二个是:串行(DISPATCH_QUEUE_SERIAL), 并行(DISPATCH_QUEUE_CONCURRENT)选择
dispatch_queue_t t = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
第一个是线程名称,选填或者填NULL
第二个是:串行(DISPATCH_QUEUE_SERIAL), 并行(DISPATCH_QUEUE_CONCURRENT)选择
dispatch_queue_get_label(dispatch_queue_t queue)
根据上一个方法,这里给出的是队列的名字
dispatch_queue_set_specific(dispatch_queue_t queue, const void *key, void *context, dispatch_function_t destructor)
dispatch_queue_get_specific(<#dispatch_queue_t queue#>, <#const void *key#>)
//这两个方法用到是可重入,比较麻烦,留坑
//异步队列,不堵塞线程
dispatch_async(dispatch_queue_t queue, ^{
//麻烦的操作
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
})
});
//同步队列,堵塞线程
dispatch_sync(dispatch_queue_t queue, ^{
});
//重复
dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) {
//第一个参数是重复的次数,第二个队列,第三个是需要做的事情 i是自己设定的,表示第几次
});
//延迟
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//第一个是延迟多少秒,block中填延迟这些秒之后做的事情
//注意这里是main队列里面来执行某些操作
});
// dispatch_get_current_queue()这是一个被抛弃的超级厉害的方法,可以获得当前进程使用的队列
Dispatch是一个通过简单但强大的API表达并发性的抽象模型。
在核心,调度提供可以提交块的串行FIFO队列。提交到这些调度队列的块在池上被调用
的线程完全由系统管理。不保证
将调用哪个线程的块;然而,保证只有一个提交到FIFO调度队列的块将被一次调用。当多个队列具有要处理的块时,系统可以自由地
分配附加线程以并发调用块。当队列变为空时,这些线程会自动释放。
抽象
调度队列按FIFO顺序调用提交给它们的块。队列每次只调用一个块,但是独立的队列可以各自相对于彼此同时调用它们的块。
讨论
调度队列是可以提交块的轻量级对象。
系统管理一个线程池,它处理调度队列并调用提交给它们的块。
在概念上,调度队列可以具有其自己的执行线程,并且队列之间的交互是高度异步的。
调度队列通过调用dispatch_retain()和dispatch_release()来引用计数。提交到队列的挂起块还保存对队列的引用,直到它们完成。一旦对一个队列的所有引用被释放,该队列将被系统释放。
FIFO 是 first in first out 先进先出 dispatch queue 就是调度队列, block就是块,很形象.
首先要创建一个队列,三种方式
1.dispatch_get_main_queue() 主队列,不必多说
2.dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>) 这个比较常用,全局队列,为系统为我们开启的一些全局线程。第一个参数是设置优先级,而flag作为保留字段备用(一般为0)。
优先级是一下四个等级
DISPATCH_QUEUE_PRIORITY_HIGH
分派到队列的项将以高优先级运行,即队列将被调度为在任何默认优先级或低优先级队列之前执行。
DISPATCH_QUEUE_PRIORITY_DEFAULT
分派到队列的项目将以默认优先级运行,即队列将在所有高优先级队列被调度之后但在任何低优先级队列被调度之前被调度执行。
DISPATCH_QUEUE_PRIORITY_LOW
分配到队列的项目将以低优先级运行,在所有默认优先级和高优先级队列都被调度之后,队列将被调度执行。
DISPATCH_QUEUE_PRIORITY_BACKGROUND
分派到队列的项目将以后台优先级运行,即队列将被调度以在所有较高优先级队列被调度之行执行
,并且系统将在具有根据设置优先级(2)的后台状态的线程上在该队列上运行项目,(磁盘I / O
被节制,并且线程的调度优先级设置为最低值)。
第一个线程名称,选填,本事天空的第二个是:串行(DISPATCH_QUEUE_SERIAL), 并行(DISPATCH_QUEUE_CONCURRENT)选择
dispatch_queue_t t = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
第一个是线程名称,选填或者填NULL
第二个是:串行(DISPATCH_QUEUE_SERIAL), 并行(DISPATCH_QUEUE_CONCURRENT)选择
dispatch_queue_get_label(dispatch_queue_t queue)
根据上一个方法,这里给出的是队列的名字
dispatch_queue_set_specific(dispatch_queue_t queue, const void *key, void *context, dispatch_function_t destructor)
dispatch_queue_get_specific(<#dispatch_queue_t queue#>, <#const void *key#>)
//这两个方法用到是可重入,比较麻烦,留坑
//异步队列,不堵塞线程
dispatch_async(dispatch_queue_t queue, ^{
//麻烦的操作
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
})
});
//同步队列,堵塞线程
dispatch_sync(dispatch_queue_t queue, ^{
});
//重复
dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) {
//第一个参数是重复的次数,第二个队列,第三个是需要做的事情 i是自己设定的,表示第几次
});
//延迟
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//第一个是延迟多少秒,block中填延迟这些秒之后做的事情
//注意这里是main队列里面来执行某些操作
});
// dispatch_get_current_queue()这是一个被抛弃的超级厉害的方法,可以获得当前进程使用的队列