大中央派遣(GCD)

GCD是用于管理任务执行的库,对于开发人员而言,异步编程使开发更容易,更安全。 异步允许任务同时执行,而不是通过在不同线程/进程上并行运行来阻止当前执行线程。 通过在后台线程上处理长时间运行的块,同时仍允许用户与主线程上的UI进行交互,它使应用程序具有更高的响应速度。

术语

串行和同步是同义词,并发和异步是可互换使用的。

主队列-处理应用程序的所有UI和未明确要求在后台队列中运行的代码的队列。

串行-串行队列中的任务一个接一个执行,一次仅执行一个任务。 任务按照插入队列的顺序执行。

并发-允许您并行执行多个任务。 任务以它们添加到队列的顺序开始,但不必等待彼此开始执行。 执行和完成的顺序不是预定的。

dispatch_queues

有两种类型的调度队列(队列由dispatch_queue_t表示),串行的和并发的。 要使用串行队列,请使用主队列

 让mainQueue = dispatch_get_main_queue 

或创建自己的

 让serialQueue = dispatch_queue_create(“ @ anthonyprograms”,DISPATCH_QUEUE_SERIAL) 

使用并发队列时,有多种选择:使用系统队列或创建自己的队列。 有四个优先级不同的系统队列,从最高到最低分别是:

  • DISPATCH_QUEUE_PRIORITY_HIGH
  • DISPATCH_QUEUE_PRIORITY_DEFAULT
  • DISPATCH_QUEUE_PRIORITY_LOW
  • DISPATCH_QUEUE_PRIORITY_BACKGROUND

优先级指出哪个任务将首先运行,优先级越高,它执行得越早。

 让systemConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 

您可以创建自己的

 让currentparallelQueue = dispatch_queue_create(“队列”,DISPATCH_QUEUE_CONCURRENT) 

将任务提交到队列

将任务提交到队列时,它可以同时运行或串行运行。

运行dispatch_sync(queue)依次运行该块,该块等待该块完成,然后再继续执行下一个任务。 并且dispatch_async始终是异步的。 只是您将所有UI块排队到同一队列中,因此不同的块将按顺序运行,但与数据处理代码并行运行。

队列示例

输出:“ polo \ n marco”。 这是因为GCD正在将异步代码块添加到队列中并继续运行该代码。

但是,当您更新UI时会发生什么? 在处理UI的后台线程上运行代码将导致崩溃。 为了在后台执行某些块,然后使用该结果来更改UI,必须首先获取主队列。

团体

假设您有一些更复杂的事情,需要更多类型的处理,并且只想在所有任务完成后更新UI。 这样,您可以使用dispatch_group_t。

  • dispatch_group_create()-创建一个新组。
  • dispatch_group_enter(group)-增加组中的任务数
  • dispatch_group_leave(group)-减少组中的任务数
  • dispatch_group_wait(group,DISPATCH_TIME_FOREVER)—等待该块,直到该组中的任务计数为0。
  • dispatch_group_notify(组,队列,块)

组例

输出:“运行更多代码\ n运行一些代码\ n将2添加到数组\ n将1添加到数组\ n更新UI”

提示

  • 如果可能,请避免在使用现有队列时创建队列,请使用dispatch_get_global_queue()。
  • 切勿在后台线程上更新UI。
  • 浏览文档,您可以使用GCD做很多其他事情。

在Twitter @anthonyprograms上关注我,并查看《 iOS纪事》以获取更多文章。