NSOperationQueue很多线程

时间:2011-05-31 06:45:07

标签: iphone multithreading nsurlconnection nsoperation nsoperationqueue

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

    0 __workq_kernreturn
    2 _init_cpu_capabilities

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

最后一点:连接可以使用工作线程本身 - 检查你正在使用的api,如果它有问题,请减少它。