2013-07-19 43 views
0

我正在從URL加載圖像到我的應用程序。圖像尺寸很大(約1.5Mb)。我如何使用許多線程(例如:2個線程)來加載此圖像以提高速度?如果使用一個線程來加載這個圖像,它需要我5秒左右,我想減少這個持續時間。從多個線程加載一個URL的圖像

+1

我不認爲使用多線程將有助於加速下載單個資源 - 瓶頸最有可能是設備可用的帶寬。 – alxmitch

+1

您需要一個服務器端腳本來將圖像分成塊並按需發送每個塊,並且您的客戶端代碼需要下載兩個(或更多)單獨的塊,當它包含所有這些塊時,重新組合它進入原始圖像。這不是一個簡單的任務。 – 2013-07-19 02:59:59

+0

對我來說似乎很難,因爲我沒有訪問服務器的權限。如果客戶可以承擔責任,那麼它會很好 – lenhhoxung

回答

1

你是對的。 1.5Mb是一個很大的圖像,優化的方式不是使用很多線程。雖然你在正確的軌道上。該技術被稱爲「切片」,並在Web上大量使用以更快地加載圖像。因此,拍攝一張圖片並將其分成3或4張較小的圖片(而不是更多)。渲染時一次調用這4個圖像。它的加載速度比一張大圖更快。這也減輕了最終用戶的「感知」延遲。此外,當您切片圖像時,可以更輕鬆地減少顯示該圖像部分所需的顏色數量,從而減少文件大小(有時非常顯着)。

作爲Google在其主要搜索頁面中用於實現其主徽標的示例。請參閱4分割我們的徽標圖片?

enter image description here

enter image description here

enter image description here

enter image description here

切片的缺點是,它增加了維護成本。有些人必須保持這些圖像分割,並確保應用程序不斷變化,沒有任何不妥之處。

+0

所以解決方案取決於服務器,我必須要求他們做到這一點。謝謝 – lenhhoxung

+0

是的解決方案是更多的服務器綁定。你可以嘗試在客戶端做到這一點,但它是沒有用的,你幾乎沒有任何性能增益。 –

0

請嘗試以下代碼:

//in .h file declare the following objects: 

    IBOutlet UIImageView *imgTest; 

-(IBAction)buttonTapped:(id)sender; 
-(void)LoadImage:(NSString *) irlString; 
-(void)setImage:(NSData *) imgData; 

//in .m file write the following code: 

-(IBAction)buttonTapped:(id)sender 
{ 
    [self performSelectorOnMainThread:@selector(LoadImage:) withObject:@"http://www.google.com/images/errors/logo_sm.gif" waitUntilDone:NO]; 
} 

-(void)LoadImage:(NSString *) urlString 
{ 
    NSURL *imgURL=[NSURL URLWithString:urlString]; 
    NSData *imgData=[NSData dataWithContentsOfURL:imgURL]; 
    [self performSelectorInBackground:@selector(setImage:) withObject:imgData]; 
} 

-(void)setImage:(NSData *) imgData; 
{ 
    imgTest.image=[UIImage imageWithData:imgData]; 
} 

您可以使用活動的指標加載圖像時也是如此。在buttonTapped方法中啓動它,並在setImage方法中停止它。

我希望這會幫助你。

+0

我不認爲這可以幫助,因爲我已經使用另一個線程來下載圖像(大數據)。 – lenhhoxung