2013-05-29 58 views
1

我注意到,當在後臺使用NSURLConnection進行下載時,在iPhone 4上滾動集合視圖時的幀率顯着下降(有時達到5 FPS)。我先是懷疑AFNetworking是罪魁禍首,但事實證明,同樣的事情發生在我簡單地使用塊:爲什麼一個異步的NSURLConnection會讓iOS在iOS上呆滯?

- (void)startBlockDownload:(id)sender 
{ 
    NSLog(@"starting block download"); 

    dispatch_queue_t defQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

    void (^downloadBlock) (void); 

    downloadBlock = ^{ 
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:_urlString]]; 
     NSURLResponse *response = nil; 
     NSError *error = nil; 

     NSData* result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

     NSLog(@"block request done"); 
    }; 

    dispatch_async(defQueue, downloadBlock); 
} 

是怎麼回事?後臺下載要求如此苛刻以至於呈現UI非常緩慢?它是慢閃存嗎?在做後臺下載時,有什麼可以做的,以保持UI的響應速度?

我創建了一個示例項目來演示該問題:https://github.com/jfahrenkrug/AFNetworkingPerformanceTest

也可參閱AFNetworking這個問題,我已經開始的話題:https://github.com/AFNetworking/AFNetworking/issues/1030#issuecomment-18563005

任何幫助表示讚賞!

+0

你一次做多少個? – borrrden

+0

只需下載一次,它就開始變得呆滯。 –

回答

2

正如你所鏈接的評論所說:iPhone 4仍然是一臺單核機器,所以無論你做多少「多任務」,它仍然只會一次執行一組代碼。更糟糕的是,sendSynchronousRequest和UI代碼都是阻塞代碼集,所以它們將佔用操作系統分配給它們的最大時間,然後操作系統將執行昂貴的上下文切換以準備執行另一個。

您可以嘗試兩件事情:

1)使用異步API的NSURLConnection,而不是派遣走了同步請求(雖然我有你和AFNetworking試過這種感覺)。

2)降低您分派到的隊列的優先級(如果可能,最好是DISPATCH_QUEUE_PRIORITY_BACKGROUND)。這可能會給主隊列執行更多的週期,但可能不會,因爲整個操作只是一個大塊。

如果這些都無法正常工作,那麼它可能只是太多的單核處理器來處理(滾動不是光燈操作,並下載需要不斷的運行時間接收數據)。無論如何,這是我最好的猜測......

+0

感謝您的輸入!是的,我通過AFNetworking嘗試了異步NSURLConnection(這就是我開始使用的):同樣的問題。使用DISPATCH_QUEUE_PRIORITY_BACKGROUND幾乎沒有什麼區別。我剛剛嘗試在iPhone 4上的App Store應用程序中下載多個應用程序更新,並注意到該官方Apple應用程序的UI也變得相當緩慢。也許沒有辦法解決它。 –