2014-03-19 126 views
0

我的表格中有一個很慢的滾動條,滾動條具有從網頁加載並調整大小,但圖像已加載的圖像,所以我不明白爲什麼滾動速度很慢。 我已閱讀並試圖slow scrolling of UITableView沒有成功(我看空細胞)在表格視圖中慢速滾動

這是細胞(它也有編碼區冠軍)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    NSString *[email protected]""; 
    NSString *icon; 

      NSMutableArray *result=[allResults objectAtIndex:indexPath.section]; 
      NSDictionary *dic=[result objectAtIndex:indexPath.row+1]; 
      if([[result objectAtIndex:0] isEqualToString:@"types"]) 
      { 
       NSString *title=[dic objectForKey:@"title"]; 
       icon=[dic objectForKey:@"icon"]; 
       data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]]; 
      } 
      if([[result objectAtIndex:0] isEqualToString:@"subServices"]) 
      { 
       NSString *title=[dic objectForKey:@"title"]; 
       icon=[dic objectForKey:@"icon"]; 
        data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]]; 

      } 
      if([[result objectAtIndex:0] isEqualToString:@"businesses"]) 
      { 
       NSString *title=[dic objectForKey:@"title"]; 
       icon=[dic objectForKey:@"logo"]; 
        data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]]; 

      } 

    cell.textLabel.numberOfLines = 1; 
    cell.textLabel.text = data; 
    cell.textLabel.textColor=[UIColor blackColor]; 
    cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:22]; 
    cell.textLabel.textColor=[UIColor colorWithRed:122.0/255.0 green:181.0/255.0 blue:196.0/255.0 alpha:1]; 
    cell.imageView.layer.masksToBounds = YES; 


    //load image 
    NSURL *url = [NSURL URLWithString:icon]; 
    NSData *imdata = [NSData dataWithContentsOfURL:url]; 
    UIImage *logo=[UIImage imageWithData:imdata scale:1]; 

    UIImage *scaled=[self resizeImage:logo imageSize:CGSizeMake(30, 30)]; 
    cell.imageView.image=scaled ; 
    cell.imageView.layer.masksToBounds = YES; 
    cell.imageView.layer.cornerRadius = 12.0; 




    return cell; 
} 
+0

您應該使用其他'/ if'(三個'if'測試consecutives)。你也可以看看延遲加載(加載你的URL圖像)。 – Larme

回答

1

首先,圖標的URL是什麼?它是你已經下載的本地圖片的文件網址嗎?如果沒有,您想要在後臺線程下載並將其緩存到本地,然後在此處使用該本地文件URL。請注意,當文件在後臺線程中下載時,您不想重新加載整個表格!只需上傳與該圖像相關的一個單元格(或者甚至更好一個imageView)。否則,你會重新加載表格,造成其他問題。

接下來,你在每次調用調整圖像大小。您應該調整圖像大小並緩存結果。如果您只在此位置使用圖片,請在下載時調整其大小,並僅緩存調整後的版本。如果您在另一個視圖中使用它,請緩存原始版本和調整後的版本。

而且,雖然一件小事情,改變你的三個如果是if/else ifs。你正在檢查相同的值,所以你不需要檢查三次。更改訂單以便首先檢查最受歡迎的選項也可以節省您一些比較。

更新:

你可以做,使這個更快的另一件事,是該單元配置一次。你每次都要設置字體,顏色等。如果將其移動到單元的子類init方法中,則不需要一遍又一遍地調用它。

此外,還有一些你不需要做的事情。檢查該更新的版本的一些注意事項:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* CellIdentifier = @"Cell"; 

    UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                   forIndexPath:indexPath]; 


    // Move this part to the init method of a subclass of UITableViewCell 
    cell.textLabel.numberOfLines = 1; 
    cell.textLabel.textColor = [UIColor blackColor]; 
    cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" 
              size:22]; 
    cell.textLabel.textColor = [UIColor colorWithRed:122.0/255.0 
               green:181.0/255.0 
               blue:196.0/255.0 
               alpha:1]; 
    cell.imageView.layer.masksToBounds = YES; 
    cell.imageView.layer.cornerRadius = 12.0; 
    // End of section to move to init methods 

    NSString* icon = nil; 

    NSMutableArray* result = [allResults objectAtIndex:indexPath.section]; 
    NSDictionary* dic = [result objectAtIndex:indexPath.row + 1]; 
    if ([[result objectAtIndex:0] isEqualToString:@"types"]) { 
     icon = [dic objectForKey:@"icon"]; 
    } 
    else if ([[result objectAtIndex:0] isEqualToString:@"subServices"]) { 
     icon = [dic objectForKey:@"icon"]; 
    } 
    else if ([[result objectAtIndex:0] isEqualToString:@"businesses"]) { 
     icon = [dic objectForKey:@"logo"]; 
    } 

    cell.textLabel.text = [dic objectForKey:@"title"]; 

    // Move the loading of the URL to a background thread if the url is not a local file URL 
    //load image 
    NSURL* url = [NSURL URLWithString:icon]; 
    NSData* imdata = [NSData dataWithContentsOfURL:url]; 
    UIImage* logo = [UIImage imageWithData:imdata 
            scale:1]; 

    // Move the resizing of the image to however you load the image from the network, 
    // resize it once and cache the results, load the cached version only 
    UIImage* scaled = [self resizeImage:logo 
           imageSize:CGSizeMake(30, 30)]; 
    cell.imageView.image = scaled; 

    return cell; 
} 
+0

我不明白,這種方法被調用一次,即使它需要時間,在某個時間點,所有圖像應該已經可以使用,所以爲什麼它保持緩慢?它一次又一次加載圖像嗎?這個函數是不是被調用過一次? – Curnelious

+0

不,這種方法每次出現在屏幕上時都會調用。如果它滾動並重新打開,它會再次調用它。 –

1

不要讓代碼在細胞加載形象,這會讓你放慢腳步。 一般情況下,你要麼預處理中的圖像下載,使他們可立即在小區創建方法或更改代碼在單元格中在後臺線程加載圖像,使它們撐不起來的細胞圖。

查看錶視圖編程指南和從蘋果塊編程指南。對不起,我正在打電話給我的簡短回答:)

1

由於顯示@Andrey Chernukha在他的回答您下載圖像同步,這導致緩慢滾動。

爲了避免這個問題,你可以使用AFNetworking,爲UIImageView是加載在異步模式下的圖像,或使用SDWebImage具有相同的功能有很大的類別,也可以寫你的NSURLSession實現加載內容。