2012-04-04 53 views
0

嗨我一直有問題快速加載圖像到屏幕上。似乎有一個延遲,我第一次打的看法:iphone - image loading

這是我如何加載圖片:

for (int i = 1; i < 19; i++) 
{ 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
    imageView = [[UIImageView alloc] initWithImage:image]; 
    frame.origin.x = cx; 
    imageView.frame = frame; 
    [scrollView addSubview:imageView]; 
    cx += scrollView.frame.size.width; 
    imageView = nil; 
} 

每個圖像爲640 x 820

+0

爲什麼你不希望加載19個640x820的圖像需要一點時間來點擊你的視圖?另外,我會關心所有這些圖像的內存使用情況。你有沒有想過僅僅在屏幕上需要延遲加載圖像? – 2012-04-04 16:00:28

回答

0

我不認爲有你可以做很多其他事情來加快速度。

但是,您確實有內存管理問題,可能會在某種程度上加快進程。

for (int i = 1; i < 19; i++)  { 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
    imageView = [[UIImageView alloc] initWithImage:image]; 
    frame.origin.x = cx; 
    imageView.frame = frame; 
    [scrollView addSubview:imageView]; 
    cx += scrollView.frame.size.width; 
    [imageView release]; 
} 
+2

如果OP使用ARC,那麼調用'release'是一個錯誤,原始代碼在內存管理方面沒有問題。 – 2012-04-04 15:48:10

0

是的,加載圖像需要一些時間。你有大量的大圖像,所以這是預期的結果。 嘗試考慮平鋪圖層,而不是將UIImages添加到滾動視圖。 CATiledLayer可能會幫助您

+0

任何可以幫助我的例子? – Mikerizzo 2012-04-04 16:04:50

2

正如其他人已經注意到您正在遇到一個基本的圖像處理問題:設備的有限I/O速度。

順便提一句,imagedNamed:內部緩存圖像,這可能解釋爲什麼後續加載速度很快。

如果平鋪不是一個選項(如@Krio推薦),您可以嘗試在需要查看視圖之前將圖像預加載到後臺線程緩存中。例如,如果此視圖通常是從另一個視圖訪問的,則可以在加載較早視圖時啓動一系列在dispatch_asyncNSOperationQueue中打包的imageNamed:調用。但這隻會在某些情況下有所幫助:

- 您知道您的圖像視圖幾乎總是要請求的下一個UI元素。

- 您事先知道哪些資產需要加載。

- 您的圖像集是不夠,你不打算填補了所有的記憶,迫使框架來趕你剛剛填寫

注意,這也增加了複雜性相當數量的高速緩存小你的應用程序設計,所以應該儘量避免,除非絕對必要。

0

嗨圖像加載凍結用戶界面。您可以在後臺執行此任務,以便UI永不結合。嘗試下面的代碼。

-(void)loadImages{ 
     [self performSelectorInBackground:@selector(loadImagesInBackGround) withObject:nil]; 
    } 

    -(void)loadImagesInBackGround{ 

     for (int i = 1; i < 19; i++) 
    { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Hole%d_", courseName, i]]; 
     imageView = [[UIImageView alloc] initWithImage:image]; 
     frame.origin.x = cx; 
     imageView.frame = frame; 
     [scrollView addSubview:imageView]; 
     cx += scrollView.frame.size.width; 
     imageView = nil; 
    } 

} 

你應該調用loadImages:你要從哪裏加載圖像。或者,您可以嘗試Grand Central Dipatch(GCD)將圖像加載到背景中。