大中央派遣(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纪事》以获取更多文章。