2015-10-28 136 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,但它發生更加頻繁,因爲它被分派到隊列是高優先級