2015-10-28 97 views
3

我正在使用NSURLSessionDataTask将数据反馈到背景中的音频流(在这种情况下并非真正相关)。NSURLSessionDataTask导致高CPU使用率

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

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

因此,我创建了NSURLSession,并使用ephemeralSessionConfiguration创建了一个配置,这也将其停止使用磁盘作为后台缓存,因此应使用最少的CPU。但是,在这种情况下,CPU使用率将升至70%80%。

使用defaultSessionConfiguration创建的配置也会发生相同的高CPU使用率,或者甚至使用[NSURLSession sharedSession]获取共享NSURLSession

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

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

更新11月16日 - 正如乔治指出的那样,didReceiveData方法看起来很糟糕。我发现,处理这个问题的唯一办法是在呼叫添加到

[NSThread sleepForTimeInterval:0.25]; 

这似乎非常激烈,但是下载时,周围10%-12%左右,从60-80%占用CPU。下载运行在它自己的线程中,所以它只是下载速度放缓。实际上,它并没有真正放慢速度 - didReceiveData只是以更大的块接收数据。在我的应用程序中,这并不重要。

+0

我看到了与Mac OS 10.11相同的问题30-50%的一个内核是通过下载单个文件占用的,其使用率取决于网络性能,看起来在使用默认或短暂配置,委托方法''URLSession:dataTask:didReceiveData:'''每** **毫秒被调用多次**!切换到后台配置可以大大地回拨我回想起我已经尝试使用任务的优先级属性,但它已经在我的设置中没有影响远。也许如果别的东西正在争夺资源的话。 – George

回答

0

你或许应该设置delegateQueueNSURLSession的是一个低优先级队列(即dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)。我认为问题不在于处理其实需要更多的CPU,但它发生更加频繁,因为它被分派到队列是高优先级