日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS中UITableView异步加载图片的实现

發布時間:2025/5/22 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS中UITableView异步加载图片的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文轉載至 http://blog.csdn.net/enuola/article/details/8639404? 最近做一個項目,需要用到UITableView異步加載圖片的例子,看到網上有一個EGOImageView的很好的例子。

但是由于,EGOImageView的實現比較復雜,于是自己就動手做了一個AsynImageView,同樣可以實現EGOImageView的效果。

而且自己寫的代碼比較清晰,容易理解,同樣可以實現指定placehoderImage以及指定imageURL,來進行圖片的異步加載。

同時,如果圖片已經請求過,則不會再重復請求網絡,會直接讀取本地緩存文件。

效果如下:

具體實現思路如下:

?

?AsynImageView.h的文件內容:

?

[cpp]?view plaincopy
  • #import?<UIKit/UIKit.h>??
  • ??
  • @interface?AsynImageView?:?UIImageView??
  • {??
  • ????NSURLConnection?*connection;??
  • ????NSMutableData?*loadData;??
  • }??
  • //圖片對應的緩存在沙河中的路徑??
  • @property?(nonatomic,?retain)?NSString?*fileName;??
  • ??
  • //指定默認未加載時,顯示的默認圖片??
  • @property?(nonatomic,?retain)?UIImage?*placeholderImage;??
  • //請求網絡圖片的URL??
  • @property?(nonatomic,?retain)?NSString?*imageURL;??
  • ??
  • @end??

  • AsynImageView.m中的文件內容:

    ?

    ?

    [cpp]?view plaincopy
  • #import?"AsynImageView.h"??
  • #import?<QuartzCore/QuartzCore.h>??
  • ??
  • @implementation?AsynImageView??
  • ??
  • @synthesize?imageURL?=?_imageURL;??
  • @synthesize?placeholderImage?=?_placeholderImage;??
  • ??
  • @synthesize?fileName?=?_fileName;??
  • ??
  • -?(id)initWithFrame:(CGRect)frame??
  • {??
  • ????self?=?[super?initWithFrame:frame];??
  • ????if?(self)?{??
  • ????????//?Initialization?code??
  • ??
  • ????????self.layer.borderColor?=?[[UIColor?whiteColor]?CGColor];??
  • ????????self.layer.borderWidth?=?2.0;??
  • ????????self.backgroundColor?=?[UIColor?grayColor];??
  • ??????????
  • ????}??
  • ????return?self;??
  • }??
  • ??
  • //重寫placeholderImage的Setter方法??
  • -(void)setPlaceholderImage:(UIImage?*)placeholderImage??
  • {??
  • ????if(placeholderImage?!=?_placeholderImage)??
  • ????{??
  • ????????[_placeholderImage?release];??
  • ??????????
  • ????????_placeholderImage?=?placeholderImage;??
  • ????????self.image?=?_placeholderImage;????//指定默認圖片??
  • ????}??
  • }??
  • ??
  • //重寫imageURL的Setter方法??
  • -(void)setImageURL:(NSString?*)imageURL??
  • {??
  • ????if(imageURL?!=?_imageURL)??
  • ????{??
  • ????????self.image?=?_placeholderImage;????//指定默認圖片??
  • ???????[_imageURL?release];??
  • ????????_imageURL?=?[imageURL?retain];??
  • ????}??
  • ??????
  • ????if(self.imageURL)??
  • ????{??
  • ????????//確定圖片的緩存地址??
  • ????????NSArray?*path=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,?NSUserDomainMask,?YES);??
  • ????????NSString?*docDir=[path?objectAtIndex:0];??
  • ????????NSString?*tmpPath=[docDir?stringByAppendingPathComponent:@"AsynImage"];??
  • ??????????
  • ????????NSFileManager?*fm?=?[NSFileManager?defaultManager];??
  • ????????if(![fm?fileExistsAtPath:tmpPath])??
  • ????????{??
  • ????????????[fm?createDirectoryAtPath:tmpPath?withIntermediateDirectories:YES?attributes:nil?error:nil];??
  • ????????}??
  • ????????NSArray?*lineArray?=?[self.imageURL?componentsSeparatedByString:@"/"];??
  • ????????self.fileName?=?[NSString?stringWithFormat:@"%@/%@",?tmpPath,?[lineArray?objectAtIndex:[lineArray?count]?-?1]];??
  • ??????????
  • ????????//判斷圖片是否已經下載過,如果已經下載到本地緩存,則不用重新下載。如果沒有,請求網絡進行下載。??
  • ????????if(![[NSFileManager?defaultManager]?fileExistsAtPath:_fileName])??
  • ????????{??
  • ????????????//下載圖片,保存到本地緩存中??
  • ????????????[self?loadImage];??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????//本地緩存中已經存在,直接指定請求的網絡圖片??
  • ????????????self.image?=?[UIImage?imageWithContentsOfFile:_fileName];??
  • ????????}??
  • ????}??
  • }??
  • ??
  • //網絡請求圖片,緩存到本地沙河中??
  • -(void)loadImage??
  • {??
  • ????//對路徑進行編碼??
  • ????@try?{??
  • ????????//請求圖片的下載路徑??
  • ????????//定義一個緩存cache??
  • ????????NSURLCache?*urlCache?=?[NSURLCache?sharedURLCache];??
  • ????????/*設置緩存大小為1M*/??
  • ????????[urlCache?setMemoryCapacity:1*124*1024];??
  • ??????????
  • ????????//設子請求超時時間為30s??
  • ????????NSMutableURLRequest?*request?=?[NSMutableURLRequest?requestWithURL:[NSURL?URLWithString:self.imageURL]?cachePolicy:NSURLRequestReloadIgnoringCacheData?timeoutInterval:60.0];??
  • ??????????
  • ????????//從請求中獲取緩存輸出??
  • ????????NSCachedURLResponse?*response?=?[urlCache?cachedResponseForRequest:request];??
  • ????????if(response?!=?nil)??
  • ????????{??
  • ????????????//????????????NSLog(@"如果又緩存輸出,從緩存中獲取數據");??
  • ????????????[request?setCachePolicy:NSURLRequestReturnCacheDataDontLoad];??
  • ????????}??
  • ??????????
  • ????????/*創建NSURLConnection*/??
  • ????????if(!connection)??
  • ????????????connection?=?[[NSURLConnection?alloc]?initWithRequest:request?delegate:self?startImmediately:YES];??
  • ????????//開啟一個runloop,使它始終處于運行狀態??
  • ??????????
  • ????????UIApplication?*app?=?[UIApplication?sharedApplication];??
  • ????????app.networkActivityIndicatorVisible?=?YES;??
  • ??
  • ????????[[NSRunLoop?currentRunLoop]?runMode:NSDefaultRunLoopMode?beforeDate:[NSDate?distantFuture]];??
  • ??????????
  • ????}??
  • ????@catch?(NSException?*exception)?{??
  • ????????//????????NSLog(@"沒有相關資源或者網絡異常");??
  • ????}??
  • ????@finally?{??
  • ????????;//.....??
  • ????}??
  • }??
  • ??
  • #pragma?mark?-?NSURLConnection?Delegate?Methods??
  • //請求成功,且接收數據(每接收一次調用一次函數)??
  • -(void)connection:(NSURLConnection?*)connection?didReceiveData:(NSData?*)data??
  • {??
  • ????if(loadData==nil)??
  • ????{??
  • ????????loadData=[[NSMutableData?alloc]initWithCapacity:2048];??
  • ????}??
  • ????[loadData?appendData:data];??
  • }??
  • ??
  • -(void)connection:(NSURLConnection?*)connection?didReceiveResponse:(NSURLResponse?*)response??
  • {??
  • ??????
  • }??
  • ??
  • -(NSCachedURLResponse?*)connection:(NSURLConnection?*)connection?willCacheResponse:(NSCachedURLResponse?*)cachedResponse??
  • {??
  • ????return?cachedResponse;??
  • ????//????NSLog(@"將緩存輸出");??
  • }??
  • ??
  • -(NSURLRequest?*)connection:(NSURLConnection?*)connection?willSendRequest:(NSURLRequest?*)request?redirectResponse:(NSURLResponse?*)response??
  • {??
  • ????//????NSLog(@"即將發送請求");??
  • ????return?request;??
  • }??
  • //下載完成,將文件保存到沙河里面??
  • -(void)connectionDidFinishLoading:(NSURLConnection?*)theConnection??
  • {??
  • ????UIApplication?*app?=?[UIApplication?sharedApplication];??
  • ????app.networkActivityIndicatorVisible?=?NO;??
  • ??????
  • ????//圖片已經成功下載到本地緩存,指定圖片??
  • ????if([loadData?writeToFile:_fileName?atomically:YES])??
  • ????{??
  • ????????self.image?=?[UIImage?imageWithContentsOfFile:_fileName];??
  • ????}??
  • ??
  • ????connection?=?nil;??
  • ????loadData?=?nil;??
  • ??????
  • }??
  • //網絡連接錯誤或者請求成功但是加載數據異常??
  • -(void)connection:(NSURLConnection?*)theConnection?didFailWithError:(NSError?*)error??
  • {??
  • ????UIApplication?*app?=?[UIApplication?sharedApplication];??
  • ????app.networkActivityIndicatorVisible?=?NO;??
  • ??????
  • ????//如果發生錯誤,則重新加載??
  • ????connection?=?nil;??
  • ????loadData?=?nil;??
  • ????[self?loadImage];??
  • }??
  • ??
  • -(void)dealloc??
  • {??
  • ????[_fileName?release];??
  • ????[loadData?release];??
  • ????[connection?release];??
  • ??????
  • ????[_placeholderImage?release];??
  • ????[_imageURL?release];??
  • ??????
  • ????[super?dealloc];??
  • }??
  • ??
  • @end??

  • 上面的AsynImageView的.h和.m文件,就是所要實現的核心代碼。如果想要調用AsynImageView,則只需執行如下代碼即可:(需導入#import"AsynImageView.h")

    ?

    ?

    [cpp]?view plaincopy
  • asynImgView?=?[[AsynImageView?alloc]?initWithFrame:CGRectMake(0,?5,?200,?100)];??
  • ????????asynImgView.placeholderImage?=?[UIImage?imageNamed:@"place.png"];??
  • ????????asynImgView.imageURL?=?[NSString?stringWithFormat:@"http://images.17173.com/2012/news/2012/10/10/lj1010sb10ds.jpg"];??
  • ????????[self.view?addSubView:asynImgView];??

  • ?

    下面是我實現的UITableView異步加載圖片的程序鏈接,就是上面的效果圖的程序完整代碼,大家可以參考一下:

    http://download.csdn.net/detail/enuola/5112070

    如有不恰當的地方,還望指點。

    另外,圖片的緩存可以定期進行清理,在此處沒有寫出清理代碼,可以自行添加。

    ?

    總結

    以上是生活随笔為你收集整理的IOS中UITableView异步加载图片的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天干天天操天天玩 | 苍井空张开腿实干12次 | 99精品欧美一区二区三区综合在线 | av中文字| av三级在线观看 | 2023国产精品| 伊人网影院 | 在线视频一区二区三区 | 岛国二区三区 | 91老司机在线 | 美女被叉叉的影院 | 国产乱淫av | 日韩毛片一区二区三区 | 性色av蜜臀av色欲av | a√在线 | 亚洲精品动漫在线观看 | 亚洲久久色| 人人爽人人爱 | 午夜av激情 | 麻豆影音先锋 | 亚洲一卡二卡在线观看 | 好吊色在线观看 | 亚洲精品中文字幕成人片 | 欧美国产一级片 | 精品久久久久亚洲 | 久艹av| 国产三级全黄裸体 | 依依成人综合 | 亚洲人性生活视频 | 老师张开让我了一夜av | 成人一级视频在线观看 | 67194成人| 亚洲欧洲中文字幕 | 国产精品免 | 美女精品在线 | 国产精品99久久久久久大便 | 日韩中文av在线 | 无码人妻精品一区二 | 免费黄网在线看 | 伊人色影院 | 在线观看免费视频一区二区 | 色一情一伦一子一伦一区 | 天天看片天天爽 | 狠色综合7777夜色撩人 | 黄色免费一级 | 国产精品一区二区免费视频 | 91日韩中文字幕 | 国产99视频在线观看 | 国产拍拍视频 | 欧美黄视频 | 激情福利网 | 99热香蕉 | 亚洲色在线视频 | 国产精品自拍在线观看 | a级在线播放 | 99re最新| 在线观看黄网站 | 日本大尺度电影免费观看全集中文版 | 日日不卡av | 亚洲综合激情 | 麻豆影视大全 | 春色激情站 | 97国产成人无码精品久久久 | 鲁鲁狠狠狠7777一区二区 | 天堂8中文在线 | 怡红院成人影院 | 女女同性高清片免费看 | 99久久精品免费看 | 美女视频黄的免费 | 91插插视频| 五月激情丁香网 | 欧美视频一区二区三区在线观看 | 国内自拍在线观看 | 国产黄色片免费看 | 97在线精品视频 | 玖玖精品在线视频 | 国产精品污 | 亚洲啪啪网站 | 夜夜躁狠狠躁 | 亚洲欧美国产高清 | 欧美中文字幕在线观看 | 妺妺窝人体色www在线下载 | 日本黄色一级网站 | 麻豆av一区二区三区久久 | 日韩高清网站 | 福利视频大全 | 国产鲁鲁视频在线观看特色 | 青青草av | 日本一区二区三区视频免费看 | 喷水av | 欧美色香蕉 | 亚洲字幕av一区二区三区四区 | 99国产精品久久久久久久 | 黄色成年人视频 | 国产精品99久久久久久动医院 | 给我看免费高清在线观看 | 在线免费播放av | 一区二区在线观看免费 | 小泽玛丽亚在线观看 |