2011-05-19 48 views
0

我的代碼需要更長的時間,然後預期。我怎樣才能減少加載時間?以前它不佔用這麼多時間。我沒有改變代碼,但它已經放慢了速度。 我的代碼如下流程:代碼需要更長的時間,然後預計

for (i =1 ; i< [productList count]; i++) { 
    UIImage *image; 
    products *productItem = [productList objectAtIndex:i-1]; 
    if(![productItem.productItemPhoto isEqualToString:@""]){ 
     NSString *productItemPhoto = productItem.productItemPhoto;   
     NSData* data = [NSData dataWithContentsOfFile:productItemPhoto]; 
     image = [[UIImage alloc] initWithData:data]; 
    } 
    else{ 
     if(numberOfProductsPerRow == 1) 
      image = [UIImage imageNamed:@"no-image-2.png"]; 
     else 
      image = [UIImage imageNamed:@"no-image-1.png"]; 
    } 
    UIImageView *bg1; 
    if(numberOfProductsPerRow == 1) 
     bg1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image-box-s7.png"]]; 
    else    
     bg1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image-box-s4.png"]]; 
     bg1.frame = CGRectMake(x, y,width, height); 
     [productScrollView addSubview:bg1]; 

     UIButton *pro1 = [[UIButton alloc] initWithFrame:CGRectMake(x+spacingX, y+spacingY-15, btnWidth, btnHeight)]; 

    [pro1 setImage:image forState:UIControlStateNormal]; 

     [pro1 setTag:i]; 
     [pro1 addTarget:self action:@selector(selectProduct:) forControlEvents:UIControlEventTouchUpInside]; 
     [productScrollView addSubview:pro1 ]; 

     UILabel *lblProductModel = [[UILabel alloc] initWithFrame:CGRectMake(0, height - 40, width, 30)]; 
     lblProductModel.backgroundColor = [UIColor clearColor]; 
     lblProductModel.textAlignment = UITextAlignmentCenter; 
     lblProductModel.textColor = [UIColor colorWithRed:1.0 green:0.8 blue:0.0 alpha:1]; 
     NSString *price; 

     if([userSettings.priceToShow isEqualToString:@"WholesalePrice"]) 
      price = [NSString stringWithFormat:@"%@%.0f",productItem.productCurrencySymbol, productItem.productWholesalePrice]; 
     else if([userSettings.priceToShow isEqualToString:@"RetailsalePrice"]) 
      price = [NSString stringWithFormat:@"%@%.0f",productItem.productCurrencySymbol, productItem.productRetailSalesValue]; 
     else 
      price = @""; 
     lblProductModel.tag = [productList count] + i; 
     lblProductModel.text = [NSString stringWithFormat:@"%@ %@", productItem.productModelCode, price]; 
     [bg1 addSubview:lblProductModel]; 
     x = x + width + 10; 
     if(i%numberOfProductsPerRow == 0){ 
      x = 20; 
      y=y+height+10; 
     } 
     [pro1 release]; 
     [image release]; 
     [bg1 release]; 
     [lblProductModel release]; 

} 
if((i-1)%numberOfProductsPerRow!=0) 
    scrollViewParent.contentSize = CGSizeMake(0, y+height+spacingY); 
else  
    scrollViewParent.contentSize = CGSizeMake(0, y + spacingY); 
productScrollView.contentSize = scrollViewParent.contentSize; 
[scrollViewParent addSubview:productScrollView]; 
} 

一些380條記錄中productList的到來。我不認爲它應該花這麼多時間。

+0

需要多少時間?你需要多少時間?你如何衡量需要多長時間? – 2011-05-19 13:48:02

+0

它需要2到3秒。它應該在秒之內。 – DivineDesert 2011-05-19 13:51:27

+0

您應該在單獨的線程上執行如此長的處理。 – 2011-05-19 14:09:16

回答

2

鑑於該代碼UI* API把玩的量,即代碼必須在主線程上運行。您正在主線程上加載大量圖像,相對而言,圖像加載非常緩慢。

首先,你真的需要在一開始加載所有380個圖像?當增長到500或1,500或15,000時會發生什麼?我敢打賭你的應用程序運行的內存某處380和15000 ....

您的代碼應該只加載它需要的圖像,然後,該循環之外這麼做。只要運行,主線程上運行的任何東西都會阻止用戶交互;保持這段時間儘可能短(或者理想情況下,根本不需要將計算移動到後臺隊列/線程)是理想的。

+0

我加載的圖像第一個屏幕,即一次8個圖像,其餘圖像在用戶向下滾動時加載。現在代碼工作正常。 – DivineDesert 2011-05-20 08:15:34

+0

太棒了;這聽起來像一個更具可擴展性的設計!在某些情況下,您會想要卸載先前加載的圖像,以確保不會使內存泄漏(如果#圖像增長)。 – bbum 2011-05-20 17:26:18

+0

除此之外,我正在實施分頁,即一次處理100張圖像。圖像的大小導致內存泄漏。所以找到了解決方法... :) – DivineDesert 2011-05-21 04:24:32

相關問題