GCD-3 Using Dispatch Groups

本文是本人自己辛苦翻译的,请转载的朋友注明,翻译于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_copyBlock_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_notifydispatch_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_copyBlock_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_NOWDISPATCH_TIME_FOREVER这个常量。
  • 返回:返回0代表成功,在超时前,所有的Block关联的组完成。返回非0代表失败,或超时。
  • 同步的等待先前传入的Block对象完成。如果Block没有完成,但是超时就会返回。当超时发生,这个组会被恢复到原来的状态。
  • 当组是空的,这个函数会马上返回。
  • 成功返回后,并这个组是空的。这个组可以被dispatch_release释放或者被另外一个Block重用。了解更多查看dispatch_group_async
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容