【发布时间】:2013-10-17 21:45:32
【问题描述】:
我有一个使用 NSThreads 执行并发任务的 iOS 应用程序。我将尝试将其迁移到使用 Grand Central Dispatch (GCD) 来处理并发。
问题在于应用需要有关自给定时间以来创建了多少线程的信息。以及自给定时间以来产生了多少线程当前正在运行。
目前,这是通过创建一个类别来完成的,该类别在NSThread 中的-main 方法上运行一个方法。在新的 swizzled 方法中,它只是增加正在运行的线程总数,然后在新的 swizzled -main 方法返回之前减少相同的变量。
问题是当我使用 GCD dispatch_async 时,它不会创建 NSThread,因此我的类别方法不起作用。如何在使用 GCD 处理并发时达到同样的效果?
我想检测的是何时将新块添加到 GCD,以及何时执行该块。
非常欢迎就如何实现这一目标提出任何建议。
编辑
非常感谢@ipmcc 和@RyanR 帮助我解决这个问题。 :) 我相信我需要更多地介绍一下背景以及我想要完成的工作。
我真正尝试的是扩展 iOS 测试框架Frank。 Frank 在给定的应用程序中嵌入了一个小型 Web 服务器,它可以向 iOS 应用程序发送 HTTP 请求,从而模拟事件、滑动或点击手势作为示例。
我想以某种方式对其进行扩展,使其能够等到由特定模拟事件触发的所有工作都结束后再根据请求返回。
但是,我发现很难准确检测收到的事件触发了哪些工作。这就是我如何找到解决方案来重置线程计数器,然后在模拟事件后为所有创建的线程增加这个计数器,并在线程完成时减少它。然后阻塞直到线程数再次变为零。我知道这种方法也不完美,它不适用于 GCP。
还有其他方法可以实现吗?我想到的另一种可能的解决方案是指定除了处理 HTTP 请求的线程之外的所有内容都必须同步运行。但是我不知道这是否可能。
关于如何在每个模拟事件之后直到该事件触发的工作完成之前实现阻塞的任何建议?
【问题讨论】:
-
你能展示一些伪代码来概述你想要做什么吗?
标签: objective-c objective-c-blocks grand-central-dispatch nsthread objective-c-category