本文是本人自己辛苦翻译的,请转载的朋友注明,翻译于Z.MJun的简书 ,感谢!<翻译不容易啊>
完成翻译于2016年5月17日
Using Dispatch Groups使用调度组
在程序里,可以提交多个块到调度组中,并且可以跟踪他们知道完成。及时他们可能是在不同的队列里运行。当进度不可知并直到所有指定的任务都完成,这个方法是很有用的。
异步组 dispatch_group_async
- 描述:提交一个Block到一个队列里和将Block和指定的调度组关联起来。
- 方法:
void dispatch_group_async( dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
- 参数:
-
group
调度组关联着Block。这个组会被系统保留,直到Block执行完毕。这个参数也不能为NULL -
queue
异步调用Block的队列,这个队列会被系统保留,直到Block执行完毕。这个参数不能为NULL。 -
block
这个Block是异步执行的,这个方法会执行Block_copy
和Block_release
。
-
- 提交一个Block到一个队列里和将Block和指定的调度组关联起来。调度组可用于等待所引用的Block对象的完成。
异步组 dispatch_group_async_f
- 描述:提交系统默认方法到一个队列里和将默认方法和指定的调度组关联起来。
- 方法:
void dispatch_group_async_f( dispatch_group_t group, dispatch_queue_t queue, void *context, dispatch_function_t work)
- 参数:
-
group
调度组关联着Block。这个组会被系统保留,直到Block执行完毕。这个参数也不能为NULL -
queue
异步调用Block的队列,这个队列会被系统保留,直到Block执行完毕。这个参数不能为NULL。 -
context
提交给默认方法的参数。 -
work
目标函数调用的系统默认方法。context
传入默认方法里。
-
- 提交系统默认方法到一个队列里和将默认方法和指定的调度组关联起来。调度组可用于等待所引用系统默认方法的完成。
创建调度组 dispatch_group_create
- 描述:创建一个新的可以关联Block的调度组。
- 方法:
dispatch_group_t dispatch_group_create( void)
- 返回:一个新的组,如果创建失败返回NULL。
- 这个方法创建一个新的可以关联Block的调度组。关联方法使用
dispatch_group_async
。这个调度组保护一个数据量的未完成的关联任务,但一个新的任务关联,数量量会增加。这个组决定任务什么时候完成任务。像使用这样的方法dispatch_group_notify
和dispatch_group_wait
确定所有关联任务的组已经完成。到那个时候,你的应用可以使用一些合适的响应。 - 当你的应用不需要使用调度组,需要调用
dispatch_release
这个方法来释放组和分配的内存。
执行组 dispatch_group_enter
- 描述:明确的表明一个Block进入这个组。
- 方法:
void dispatch_group_enter( dispatch_group_t group)
- 参数:
-
group
更新调度组。这个参数也不能为NULL
-
- 在组中调用这个方法来递增当前未完成的任务计数。如果在这个组里明确的增加或移除任务,可以使用这个方法
dispatch_group_leave
让应用正确的管理任务计数。通过使用dispatch_group_async功能以外(by a means other than using the dispatch_group_async function)。调用这个方法,必须要调用dispatch_group_leave
做释放。你可以同时在多个组里使用这个方法来关联Block。
结束组 dispatch_group_leave
- 描述:明确的表明一个Block在这个组里被完成了。
- 方法:
void dispatch_group_leave( dispatch_group_t group)
- 参数:
-
group
更新调度组。这个参数也不能为NULL
-
- 在组中调用这个方法来减少当前未完成的任务计数。如果在这个组里明确的增加或移除任务,可以使用这个方法
dispatch_group_enter
让应用正确的管理任务计数。通过使用dispatch_group_async功能以外(by a means other than using the dispatch_group_async function)。调用这个方法前,必须要调用dispatch_group_enter
做释放。只能调用一次,多次调用会导致负计数。
异步结束组通知 dispatch_group_notify
- 描述:当组内的Block全部执行完毕,异步通知传入这个函数的block。
- 方法:
void dispatch_group_notify( dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
- 参数:
-
group
观察这个调度组,这个组会被系统保留直到Block完成。这个参数也不能为NULL -
queue
传入队列,队列会被系统保留直到Block完成。这个参数也不能为NULL -
block
当组完成,提交block。这个方法会执行Block_copy
和Block_release
,这个参数也不能为NULL。
-
- 当组内的Block全部执行完毕,异步通知传入这个函数的block。如果组是空的,没有Block关联到调度组上,这个Block会马上返回。
- 当通知Block被提交,并组是空的。这个组可能被
dispatch_release
释放也或者被额外的Block对象重用。想要了解更多,看dispatch_group_async
。
异步结束组通知 dispatch_group_notify_f
- 描述:当组内的Block全部执行完毕,异步通知传入默认系统函数。
- 方法:
void dispatch_group_notify_f( dispatch_group_t group, dispatch_queue_t queue, void *context, dispatch_function_t work)
- 参数:
-
group
观察这个调度组,这个组会被系统保留直到Block完成。这个参数也不能为NULL -
queue
传入队列,队列会被系统保留直到Block完成。这个参数也不能为NULL -
context
默认系统函数的参数。 -
work
当组完成,目标队列会调用这个函数。
-
- 当组内的Block全部执行完毕,异步通知传入默认系统函数。如果组是空的,没有Block关联到调度组上,这个函数会马上返回。
- 当通知Block被提交,并组是空的。这个组可能被
dispatch_release
释放也或者被额外的Block对象重用。想要了解更多,看dispatch_group_async
。
同步结束组通知 dispatch_group_wait
- 描述:同步的等待先前传入的Block对象完成。如果Block没有完成,但是超时就会返回。
- 方法:
long dispatch_group_wait( dispatch_group_t group, dispatch_time_t timeout)
- 参数:
-
group
调度组。这个参数也不能为NULL。 -
timeout
如果超时(看dispatch_time
)。DISPATCH_TIME_NOW
和DISPATCH_TIME_FOREVER
这个常量。
-
- 返回:返回0代表成功,在超时前,所有的Block关联的组完成。返回非0代表失败,或超时。
- 同步的等待先前传入的Block对象完成。如果Block没有完成,但是超时就会返回。当超时发生,这个组会被恢复到原来的状态。
- 当组是空的,这个函数会马上返回。
- 成功返回后,并这个组是空的。这个组可以被
dispatch_release
释放或者被另外一个Block重用。了解更多查看dispatch_group_async
。