NSURLSessionDataTask导致高CPU使用率

时间:2015-10-28 17:34:31

标签: ios iphone

我正在使用NSURLSessionDataTask将数据提供给后台的音频流(在这种情况下并不相关)。

我遇到的问题只发生在下载代码中 - 我已经将其隔离并简单地丢弃了数据,因此系统的其他部分都没有影响它。

我观察到如果我使用NSURLSession创建的配置(NSURLSessionConfiguration)创建backgroundSessionConfigurationWithIdentifier,则下载时的CPU使用率很低(<5%)。虽然这有效(95%的时间),但我认为它不是受支持的配置。当应用程序位于前台时,我也只需要这个工作。

所以,相反,我使用NSURLSession创建了一个配置ephemeralSessionConfiguration,这也使用磁盘作为后台缓存来阻止它,因此应该使用最少的CPU。但是,在这种情况下,CPU使用率会发生在70%和70%之间。 80%。

使用defaultSessionConfiguration创建的配置甚至使用NSURLSession获取共享[NSURLSession sharedSession]时,也会出现相同的高CPU使用率。

每种方案之间的数据吞吐量保持不变 - 只是不在后台运行会导致高CPU使用率。

我使用SDK 9.1在iOS 9.1上运行。它发生在模拟器和设备上。

11月16日更新 - 正如乔治所指出的那样,似乎是didReceiveData方法被打破了。我发现处理此问题的唯一方法是添加对

的调用
[NSThread sleepForTimeInterval:0.25];

看起来非常激烈,但下载时CPU占用了大约60-80%,大约10-12%。下载正在它自己的线程中运行,因此只有下载才会减慢。事实上,它并没有真正放慢速度 - didReceiveData只是以更大的块接收数据。在我的应用程序中,这无关紧要。

1 个答案:

答案 0 :(得分:0)

您应该将delegateQueue的{​​{1}}设置为低优先级队列(即NSURLSession。我认为问题不在于处理实际上需要更多CPU,而是它更频繁地发生,因为它调度的队列是高优先级的。