2012-07-06 60 views
2

目前,我正在爲網站的客戶端工作。我有一噸圖像,我需要加載到我的TableView。以下是我在做currectly:緩存NSData(與UIImages)

NSDictionary *propertyItems = [self.items objectAtIndex:indexPath.row]; 
    cell.fio.font = [UIFont boldSystemFontOfSize:17.0f]; 

    if([propertyItems objectForKey:@"online"] == [NSNumber numberWithInt:1]) 
     cell.fio.textColor = [UIColor colorWithRed:0.3 green:0.6 blue:0.3 alpha:1.0]; 

    dispatch_queue_t downloadPhotosQueue = dispatch_queue_create("downloadPhotosQeue", NULL); 
    dispatch_async(downloadPhotosQueue, ^{ 
     NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.pic.image = [UIImage imageWithData:photosData]; 
     }); 

    }); 

    cell.fio.text = [propertyItems objectForKey:@"fio"]; 

我這樣做是在的cellForRowAtIndexPath:方法。 一切正在加載更快。但問題是,當我將桌子向下滾動時,再次上來後,圖像一遍又一遍地重新加載。

問題:有沒有什麼辦法可以輕鬆緩存我從服務器上獲取的UIImages?所以如果他們被加載一次,他們不會一遍又一遍地重新加載,而我正在運行應用程序。也許我做錯了什麼?

在此先感謝!

回答

1

我強烈建議AsyncImageView。我使用它,它像一個魅力。只需設置圖片網址,它就可以處理所有內容。

AsyncImageView *imageView = [[AsyncImageView alloc]init]; 
imageView.imageURL = [NSURL URLWithString:@"https://www.google.es/logos/classicplus.png"]; 

它將圖像緩存在內存中,所以它不會再從服務器上檢索它。它還會在收到內存警告時釋放它們。

1

要從網站加載圖片我使用AFNetworking。它提供了一類以從URL加載圖像:通過添加#進口「的UIImageView + AFNetworking」發送給 控制器頂部或視圖的實現文件

開始。此類別向UIImageView添加了方法 ,例如:

[imageView setImageWithURL:[NSURL URLWithString:@「...」]];

0

的問題是在這裏:

NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]]; 

dataWithContentsOfURL

它發起請求的URL每次調用函數時(每次您滾動)。 您需要在cellForRowAtIndexPath之前加載所有圖片。 像在ViewDidLoad。 您可以將它們存儲在數組中,並將圖片的數組顯示在cellForRowAtIndexPath中。

如果真的很快加載,就像你說:jsut加載圖片一次在CellForRowAtIndexPath。將它們存儲在一個mutableArray中。並檢查圖片是否已經存在。

1

我推薦this庫來實現你想要的。

cellForRowAtIndexPath:

[cell.imageView setImageWithURL: 
    [NSURL URLWithString:[NSString stringWithString:@"www.yourimagepath.path"]] 
     placeholderImage:[UIImage imageNamed:@"no_image.jpg"]]; 

庫將緩存圖像爲您服務。您還可以設置圖像的setHolder,因此在圖像下載時它不會看起來像空白圖像。