我正在使用
NSURLSessionDataTask
将数据输入到后台音频流中(在这种情况下并不相关)。我遇到的问题仅与下载代码有关 - 我已经将其隔离并简单地丢弃数据,因此系统的其他部分对其没有影响。我观察到,如果我使用由 backgroundSessionConfigurationWithIdentifier
创建的 config (NSURLSessionConfiguration
) 创建 NSURLSession
,则下载时的 CPU 使用率很低(<5%)。虽然这样可以正常工作(95% 的时间),但我认为这不是一种受支持的配置。而且我只需要在应用程序在前台运行时让它工作。因此,我使用使用 ephemeralSessionConfiguration
创建的配置创建 NSURLSession
,这也停止了它将磁盘用作后台缓存,因此应该使用最少的 CPU。但是,在这种情况下,CPU 使用率却飙升到 70% 至 80%。同样的高 CPU 使用率也会发生在使用 defaultSessionConfiguration
创建的配置或者使用 [NSURLSession sharedSession]
获取共享 NSURLSession
的情况下。每种情况下的数据吞吐量都没有改变 - 只是不在后台运行会导致高 CPU 使用率。我正在运行 iOS 9.1,使用 SDK 9.1。它在模拟器和设备上都会发生。更新11月16日——正如George所指出的那样,似乎 didReceiveData 方法需要大量计算资源。我找到的唯一处理方法是添加一个调用。[NSThread sleepForTimeInterval:0.25];
这似乎是一个相当激进的措施,但它将下载时的CPU占用率从60-80%降至10-12%左右。该下载在它自己的线程中运行,因此只会减缓下载速度。实际上,它并没有真正减缓 - 只是didReceiveData
以更大的块接收数据而已。在我的应用程序中,这并不重要。