0

在我们的 iPhone 应用程序中,我们有几个选项卡,选择每个选项卡都会触发网络连接。过去我们只是为每个连接分离新线程。在几个非常快速的选项卡切换应用程序变得无响应之后。现在我们决定使用应该控制线程数并且不应该让应用程序变得无响应的操作队列。但是现在,即使使用较少的快速开关,应用程序也会变得无响应(尽管现在它可以更快地从无响应中恢复)。我从 xcode 在设备上运行该应用程序,并在几次快速切换后暂停它以查看线程数。我发现有几个线程具有以下堆栈:

    0 __workq_kernreturn
    2 _init_cpu_capabilities

知道这些线程是什么以及如何摆脱它们吗?

4

2 回答 2

0

使用 NSOperationQueue 的一大好处是您可以忘记线程并让系统为您担心。听起来您的问题的根源在于您有几个不再需要的操作同时运行。与其担心特定的线程,不如考虑让这些操作终止,这样它们就不会再耗尽计算资源。

对于它的价值,我猜这些线程是由 Grand Central Dispatch 管理的。GCD 将创建工作线程来处理块(和操作),并且它会尽可能高效。

于 2011-05-31T07:08:56.853 回答
0

您问题的重要部分可能并不在于工作线程的内部/私有实现。一个好的实现可能会使用线程池,因为每个操作创建一个线程会花费很多。操作可以重用并保留空闲线程。

重要的部分(可能)在于您使用您选择的实现的公共 api。

在这种情况下支持的一个明显实现是操作取消:-[NSOperation cancel]. 当有人离开一个有待处理/未完成请求的视图时,只需取消它(除非您需要缓存数据)。

许多实现也可以通过减少请求而受益。例如:如果您的服务器结果大约每小时更新一次,那么“大约每分钟”请求它是没有意义的。

最后一点:连接本身可以使用工作线程 - 如果出现问题,请检查您正在使用的 api 以减少这种情况。

于 2011-05-31T07:10:51.390 回答