1

我有一个场景,我必须遍历一个帐号列表,去获取这些账户的详细信息,然后将聚合信息传递给 completionBlock。为了促进这一点,我正在使用 dispatch_group_* 方法。不幸的是,即使我已明确调用,在组完成之前仍会调用完成块

dispatch_group_wait(_imfDispatchGroup, DISPATCH_TIME_FOREVER);

控制台日志示例(原始):

2012-10-28 13:58:46.722 ThreadingHell[81909:303] 在 loginResponse 中

2012-10-28 13:58:46.724 ThreadingHell[81909:303] 在 obj 的帐户循环内:account1

2012-10-28 13:58:46.724 ThreadingHell[81909:303] 在 obj 的帐户循环内:account2

2012-10-28 13:58:46.724 ThreadingHell[81909:1b03] 内部细节:L0i6kRVzGG 细节

2012-10-28 13:58:46.724 ThreadingHell[81909:1a03] 内部细节:SE0QjhO8Hh 细节

2012-10-28 13:58:46.724 ThreadingHell[81909:303] 在 obj 的帐户循环内:account3

2012-10-28 13:58:46.725 ThreadingHell[81909:1a03] 内部完成 __66-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015

2012-10-28 13:58:46.725 ThreadingHell[81909:1803] 内部细节:9SsGYOX3u5 细节

2012-10-28 13:58:46.725 ThreadingHell[81909:1a03] 账户详情

2012-10-28 13:58:46.725 ThreadingHell[81909:303] 在 obj 的帐户循环内:account4

2012-10-28 13:58:46.725 ThreadingHell[81909:1b03] 内部完成 __66-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015

2012-10-28 13:58:46.726 ThreadingHell[81909:1803] 内部完成 __66-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015

2012-10-28 13:58:46.726 ThreadingHell[81909:303] 在 obj 的帐户循环内:acount5

2012-10-28 13:58:46.726 ThreadingHell[81909:1a03] 成功帐户循环

2012-10-28 13:58:46.726 ThreadingHell[81909:1b03] 详细信息已找到帐户

2012-10-28 13:58:46.726 ThreadingHell[81909:2303] 内部细节:wSXis5bIVs 细节

2012-10-28 13:58:46.728 ThreadingHell[81909:1803] 账户详情

2012-10-28 13:58:46.728 ThreadingHell[81909:2403] 内部细节:SrIfbzBLr7 细节

2012-10-28 13:58:46.728 ThreadingHell[81909:1a03] accountDetails 的当前实例:(“L0i6kRVzGG 详细信息”)

2012-10-28 13:58:46.728 ThreadingHell[81909:1803] 成功帐户循环

2012-10-28 13:58:46.728 ThreadingHell[81909:1b03] 成功帐户循环

2012-10-28 13:58:46.729 ThreadingHell[81909:2403] 内部完成 __66-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015

2012-10-28 13:58:46.729 线程地狱[81909:303] !!!!!!!!!!!! 即将调用完成块。这应该是最后

2012-10-28 13:58:46.729 ThreadingHell[81909:2303] 内部完成 __66-[ModelManager getAccountDetailsForAccountNumber:completionBlock:]_block_invoke_015

2012-10-28 13:58:46.730 ThreadingHell[81909:1803] accountDetails 的当前实例:(“L0i6kRVzGG 详细信息”,“9SsGYOX3u5 详细信息”)

2012-10-28 13:58:46.730 ThreadingHell[81909:1b03] accountDetails 的当前实例:(“L0i6kRVzGG 详细信息”、“9SsGYOX3u5 详细信息”、“SE0QjhO8Hh 详细信息”)

2012-10-28 13:58:46.731 ThreadingHell[81909:2403] 账户详情

2012-10-28 13:58:46.731 ThreadingHell[81909:2303] 账户详情

2012-10-28 13:58:46.732 ThreadingHell[81909:2403] 成功帐户循环

2012-10-28 13:58:46.731 ThreadingHell [81909:303] obj: { }

2012-10-28 13:58:46.732 ThreadingHell[81909:2303] 成功帐户循环

2012-10-28 13:58:46.732 ThreadingHell [81909:303] 错误:(空)

2012-10-28 13:58:46.732 ThreadingHell[81909:2403] accountDetails 的当前实例:(“L0i6kRVzGG 详细信息”、“9SsGYOX3u5 详细信息”、“SE0QjhO8Hh 详细信息”、“wSXis5bIVs 详细信息”)

// 来自最新提交的更新日志 [https://github.com/kwylez/ThreadingHell/tree/80cc29fab142b4dc1f386df747c5142b28e2dd84]

1b03] accountDetails的当前实例:(“CP3ioYdvXp详细信息”,“6k635XoJOV详细信息”,“2TjGF1fdaZ详细信息”,“0YiuX9gHsu详细信息”,“9RcyOfjRa5详细信息”)2012-10-28 16:32:39.008 ThreadingHell[83171:303]! !!!!!!!!!即将调用完成块。这应该是最后 2012-10-28 16:32:39.009 ThreadingHell[83171:303] obj: { } 2012-10-28 16:32:39.009 ThreadingHell[83171:303] 错误:(空)

我错过了什么“操作顺序”?

这是 github 上示例项目的链接(代码太多,无法放在这里):

https://github.com/kwylez/ThreadingHell

4

2 回答 2

0

(我还没有下载你的项目,在我的手机上接听,道歉......)

请改用 NSOperationQueue。将每个操作添加为完成操作的依赖项。

这是一个更清洁、更像可可的 API。您不必进行太多更改,因为您可以使用 NSBlockOperation 并传入您当前用于 GCD 的相同块。

于 2012-10-28T18:56:32.600 回答
0

最新的代码提交

解决了我发表的最后一条评论的问题,因此我的问题得到了回答……使用 dispatch_group 方法。

在该getAccountDetailsForAccountNumber:completionBlock方法中,我删除了对方法的调用dispatch_group_notify并移动了“完成”块登录dispatch_group_async。这解决了这个问题,因为完成块现在是队列任务的一部分,并且getAccountListMetaInformation:必须“服从”dispatch_group_wait命令,而不是在通知之后接收并发通知之前。

于 2012-10-28T20:45:08.963 回答