我正在使用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
只是以更大的块接收数据。在我的应用程序中,这无关紧要。
答案 0 :(得分:0)
您应该将delegateQueue
的{{1}}设置为低优先级队列(即NSURLSession
。我认为问题不在于处理实际上需要更多CPU,而是它更频繁地发生,因为它调度的队列是高优先级的。