2011-04-26 82 views
0

我的應用程序是反應太慢,我想我不會加載圖像異步,但即使我做的還是那麼的tableview讓我的控制器負載過慢。爲實現代碼如下的代碼如下:的tableview不那麼敏感

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

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; 
    UILabel *productNameLbl = [[UILabel alloc] initWithFrame:CGRectMake(83, 8, 200,10)]; 
     [productNameLbl setFont:[UIFont boldSystemFontOfSize:12.0]]; 
     [productNameLbl setTag:20]; 
     [cell.contentView addSubview:productNameLbl]; 
     [productNameLbl release]; 


} 

else { 
    AsyncImageView *oldImage = (AsyncImageView*)[cell.contentView viewWithTag:299]; 
    [oldImage removeFromSuperview]; 
} 


NSString *baseImageURL = @"http://samplesite.com/"; 

AsyncImageView* asyncImage = [[[AsyncImageView alloc] initWithFrame:CGRectMake(5, 5, 70, 70)] autorelease]; 
asyncImage.tag = 299; 
NSMutableString *url = [[NSMutableString alloc] initWithString:@""]; 
NSString *iconUrl = [NSString stringWithString:[[[[[DataCollection sharedObject] categoryProducts ] productsList ]objectAtIndex:indexPath.row] productImage]]; 

[url appendString:baseImageURL]; 
[url appendString:iconUrl]; 
NSURL *imageURL = [NSURL URLWithString:url]; 
[asyncImage loadImageFromURL:imageURL]; 
[cell.contentView addSubview:asyncImage]; 

[(UILabel *) [cell viewWithTag:20] setText:[NSString stringWithString:[[[[[DataCollection sharedObject] categoryProducts ] productsList ]objectAtIndex:indexPath.row] productName]]]; 
//..... rest of the code 

什麼其實我想要的是,首先加載視圖,然後可以加載數據的圖像和休息。 請告訴我如何讓我的tableview更具響應性。

+1

良好的格式是你的朋友! – 2011-04-26 07:48:37

+0

您正在泄漏的imageview的 [細胞setSelectedBackgroundView:[[ALLOC的UIImageView] initWithImage:[UIImage的imageNamed:@ 「highlightstrip.png」]]]; 這應該是: [細胞setSelectedBackgroundView:[[[ALLOC的UIImageView] initWithImage:[UIImage的imageNamed:@ 「highlightstrip.png」]自動釋放]]]; – rckoenes 2011-04-26 07:52:05

回答

2

你每次細胞被顯示的時間createing所有的標籤。 您應該爲所有標籤添加標籤並通過標籤找到它們。所以不要創建它們。

或者更好的創建自定義tabelCell你所需要的所有控制。

您可以在UITableViewDelegate方法willDisplayCell中添加異步圖像:AtIndex:然後檢查某種本地緩存是否已經下載了圖像。 看看ASIHttpRequest,它有一個非常好用的緩存系統。

+0

我已經使用異步調用的圖像。但是控制器仍然很慢。我如何顯示視圖,然後加載它?我的意思是從根控制器導航到視圖控制器,截至目前它首先加載數據,然後顯示視圖。我只想改變過程,首先顯示視圖,然後加載數據。請告訴我我該怎麼做? – donito 2011-04-26 10:36:58

1

如果你讓你的代碼aysnc的這個整體的一部分,你的代碼將是非常流暢(介意你的漏洞+撥款雖然)。

NSMutableString *url = [[NSMutableString alloc] initWithString:@""]; 
NSString *baseImageURL = @"http://samplesite.com/"; 
NSString *imagePath = [NSString stringWithString:[[[[DataCollection sharedObject] popularProducts]objectAtIndex:indexPath.row] productImage]]; 

[url appendString:baseImageURL]; 
[url appendString:imagePath]; 
NSURL *imageURL = [NSURL URLWithString:url]; 

NSData *data = [NSData dataWithContentsOfURL:imageURL]; 
UIImage *img = [[UIImage alloc] initWithData:data cache:NO]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:img]; 
[imageView setFrame:CGRectMake(10, 10, 70, 70)]; 
[cell addSubview:imageView]; 
[imageView release]; 
+0

我已經使它異步,但我仍然想知道如何顯示控制器,然後加載數據。任何幫助,請? – donito 2011-04-26 13:37:22

+1

什麼是上述代碼的異步? – Jake 2011-04-26 15:42:14

+0

我用這個庫 https://github.com/hugowetterberg/HBaseLibrary/blob/master/README.markdown ,但現在它顯示我另一個錯誤: 未定義的符號: 「_OBJC_CLASS _ $ _ AsyncImageLoader」,從引用: AsyncImageView.o中的objc-class-ref-to-AsyncImageLoader ld:symbol(s)not found collect2:ld返回1退出狀態 我沒有在我的項目中添加整個庫,而是僅複製了選定的文件及其參考文件也是如此。請告訴我如何刪除此錯誤? – donito 2011-04-27 09:15:40