亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS異步下載圖片實例代碼

2020-07-26 03:17:05
字體:
來源:轉載
供稿:網友

寫在前面

在iOS開發中,無論是在UITableView還是在UICollectionView中,通過網絡獲取圖片設置到cell上是較為常見的需求。盡管有很多現存的第三方庫可以將下載和緩存功能都封裝好了供開發者使用,但從學習的角度出發,看懂源碼,理解其中的原理,結合自身的實際需求寫出自己的代碼是很必要的。在剛結束的Demo中,有用到異步圖片下載功能,這篇筆記就是對整個實現的簡單整理。

基本思路

•cell中添加一個UIImageView

•cell擁有url,發起下載請求,注冊下次完成通告,在通告處理時間中獲取下載圖片并設置

•下載管理類負責開啟下載線程和各種緩存(內存+文件),下載完成后發送下載完成通告

•為避免cell重用和異步下載造成的圖片錯位,cell在發起下載前為自身imageView設置默認圖片,同時為imageView設置tag

整體框架

 

關鍵代碼

cell初始化,并注冊下載完成通告

@interface SQPhotoCell ()@property (strong, nonatomic) UIImageView *photoView;//Tag指向當前可見圖片的url,可過濾掉已經滑出屏幕的圖片的url@property (strong, nonatomic) NSString *imageViewTag;@end-(id)initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if (self){_photoView = [[UIImageView alloc] initWithFrame:CGRectZero];_photoView.userInteractionEnabled = YES;[self.contentView addSubview:_photoView];_imageViewTag = @"";//注冊下載完成通知[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(downloadCallback:)name:NOTIFICATION_DOWNLOAD_CALLBACKobject:nil];}return self;}

cell通知處理事件

//通知處理事件- (void)downloadCallback:(NSNotification *)noti{NSDictionary *notiDic = noti.userInfo;NSString *urlStr = [notiDic objectForKey:@"urlStr"];UIImage *image = [notiDic objectForKey:@"image"];if ([self.imageViewTag isEqualToString:urlStr]){self.photoView.image = image;}}

cell發起下載請求

- (void)setImageWithURL:(NSString *)urlStr placeholder:(UIImage *)placeholder{self.imageViewTag = urlStr;//預設圖片,用于清除復用以前可能存在的圖片self.photoView.image = placeholder;if (urlStr){SQWebImageManager *manager = [SQWebImageManager sharedManager];[manager downloadImageWithURLString:urlStr];}[self setNeedsDisplay];}

下載管理類下載函數

- (void)downloadImageWithURLString:(NSString *)urlStr{// 1.判斷內存緩存 {urlStr: image}UIImage *cacheImage = [self.imageCache objectForKey:urlStr];if (cacheImage != nil){//發出下載完成的通知,并傳回urlStr和圖片[self postDownloadCompleteNotification:urlStr withImage:cacheImage];return;}// 2.判斷沙盒緩存NSString *cacheImagePath = [self cacheImagePathWithURLString:urlStr];cacheImage = [UIImage imageWithContentsOfFile:cacheImagePath];if (cacheImage != nil){// 從沙盒中讀取到了圖片,設置到內存緩存中,方便下次可以直接從內存中讀取[self.imageCache setObject:cacheImage forKey:urlStr];// 返回圖片[self postDownloadCompleteNotification:urlStr withImage:cacheImage];return;}// 3.判斷操作緩存,防止圖片多次下載 {urlStr: operation}if (self.operationCache[urlStr] != nil){// 有操作正在下載這張圖片NSLog(@"有操作正在下載這張圖片");return;}// 1.定義下載圖片操作SQDownloadOperation *downloadOperation = [SQDownloadOperation downloadOperationWithURLString:urlStr cacheImagePath:cacheImagePath];// 設置操作下載完成的回調,當 downloadOperation 的 main 方法執行完成的時候回調用__weak typeof(downloadOperation) weakDownloadOperation = downloadOperation;downloadOperation.completionBlock = ^() {// 1. 獲取下載完成的圖像UIImage *image = [weakDownloadOperation getDownloadImage];// 2. 從操作緩沖池中刪除操作[self.operationCache removeObjectForKey:urlStr];// 3. 判斷圖像是否為空(縮略圖)if (image != nil){// 設置下載的圖片到圖片內存緩存中[self.imageCache setObject:image forKey:urlStr];// 4. 主線程回調[[NSOperationQueue mainQueue] addOperationWithBlock:^{//發出下載完成通告[self postDownloadCompleteNotification:urlStr withImage:image];}];}else{//如果圖片為空,返回下載失敗時的默認圖片image = [UIImage imageNamed:@"default.jpg"];// 4. 主線程回調[[NSOperationQueue mainQueue] addOperationWithBlock:^{//發出下載完成通告[self postDownloadCompleteNotification:urlStr withImage:image];}];}};// 2.將下載圖片操作添加到隊列中[self.downloadQueue addOperation:downloadOperation];// 3.將下載圖片操作添加到下載操作緩存中[self.operationCache setObject:downloadOperation forKey:urlStr];}- (void)postDownloadCompleteNotification:(NSString *)urlStr withImage:(UIImage *)image{NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:urlStr, @"urlStr", image, @"image",nil];[[NSNotificationCenter defaultCenter]postNotificationName:NOTIFICATION_DOWNLOAD_CALLBACKobject:niluserInfo:dic];}

控制器中使用

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{SQPhotoCell *cell = (SQPhotoCell *)[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifierforIndexPath:indexPath];UIImage *placeholder = [UIImage imageNamed:@"gray.jpg"];NSString *imageUrl = @"http://www.taopic.com/uploads/allimg/110925/9117-11092509545328.jpg";[cell setImageWithURL:imageUrl placeholder:placeholder];return cell;}

寫在后面

這個異步下載圖片的思路是仿照SDWebImage的,雖然可以直接看到源碼,也有一些文章和博客講解思路,但自己在沒有接觸過多線程編程的情況下學習這個下載思路還是花了挺多時間的。前期一直都有些著急,想要趕緊做出來,在對好多東西都是懵懵懂懂的情況下就去做了,后來才慢慢意識到,其實慢就是快,慢下來,把問題想清楚了再去實施雖然前期感覺是不太好的,但到越到后面就越能發現這種慢的好處。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲永久精品大片ww免费漫画| 国内精品一区二区三区| 456国产精品| 91亚洲精品视频| 国产精品爽爽ⅴa在线观看| 欧美日韩一区二区三区在线免费观看| 久久久久久久久综合| 欧美第一页在线| 欧美黑人极品猛少妇色xxxxx| 亚洲精品自拍第一页| 欧美日韩国产中文精品字幕自在自线| 久久天天躁狠狠躁夜夜躁| 精品在线小视频| 伊人伊人伊人久久| 91香蕉嫩草神马影院在线观看| 国产精品美女999| 国产在线观看精品一区二区三区| 日韩少妇与小伙激情| 欧美日韩国产综合视频在线观看中文| 久久久av一区| 亚洲最大福利网| 91久久精品国产91久久性色| 久久久久久久久亚洲| 欧美影院成年免费版| 久久综合五月天| 国产精品丝袜久久久久久不卡| 日日骚av一区| 欧美日韩激情小视频| 亚洲人成毛片在线播放| 日韩国产精品一区| 97视频国产在线| 亚洲国产第一页| 国产精品看片资源| 国产精品普通话| 国产午夜精品视频免费不卡69堂| 91a在线视频| 国产91在线播放九色快色| 欧美日韩亚洲精品内裤| 亚洲欧美综合图区| 亚洲精品456在线播放狼人| 98视频在线噜噜噜国产| 国产精品久久久久9999| 精品国产一区二区三区四区在线观看| 欧美日韩在线视频观看| 国产精品三级久久久久久电影| 国产三级精品网站| 久久九九国产精品怡红院| 成人自拍性视频| 国产精品一区二区女厕厕| 国产午夜精品一区二区三区| 欧美午夜性色大片在线观看| 国产精品入口日韩视频大尺度| 91在线免费视频| 欧美另类暴力丝袜| 欧美极品在线播放| 韩国三级日本三级少妇99| 爽爽爽爽爽爽爽成人免费观看| 北条麻妃久久精品| 国产中文字幕日韩| 国产成人精品免高潮费视频| 亚洲男人av在线| 深夜福利国产精品| 在线日韩第一页| 亚洲精品小视频| 粉嫩av一区二区三区免费野| 夜夜嗨av色一区二区不卡| 国产一区二区欧美日韩| 欧美黑人国产人伦爽爽爽| 96sao精品视频在线观看| 久久伊人精品一区二区三区| 欧美激情第1页| 国产中文日韩欧美| 国产成人精品999| 亚洲人成欧美中文字幕| 国产91精品视频在线观看| 精品中文字幕视频| 国产在线视频2019最新视频| 在线观看欧美成人| 亚洲xxxx视频| 精品中文字幕久久久久久| 欧美视频裸体精品| 欧美大片在线看免费观看| 国产精品日韩在线播放| 日韩精品在线观看一区| 伊人久久五月天| 日韩电影免费观看在线观看| 午夜精品一区二区三区在线播放| 国产精品视频公开费视频| 亚洲第一中文字幕在线观看| 国产精品最新在线观看| 欧美黑人巨大精品一区二区| 欧美电影在线观看高清| 国产精品日韩在线一区| 亚洲韩国欧洲国产日产av| 91在线直播亚洲| 国产在线观看一区二区三区| 亚洲国产精品久久精品怡红院| 午夜精品99久久免费| 九九热在线精品视频| 亚洲欧美日韩中文在线制服| 精品久久久久久久久久久| 欧美一区二区大胆人体摄影专业网站| 国产丝袜一区视频在线观看| 久久国产加勒比精品无码| 国产精品视频自拍| 亚洲精品美女久久| 久久久精品久久| 最新国产精品亚洲| 欧美精品www| 狠狠色狠狠色综合日日五| 国产欧美亚洲视频| 欧洲美女7788成人免费视频| 久久久久久这里只有精品| 色青青草原桃花久久综合| 91在线视频精品| 亚洲电影免费观看高清完整版在线观看| 国产视频精品自拍| 欧美一级免费视频| 久久久久久有精品国产| 2024亚洲男人天堂| 日韩欧美亚洲一二三区| 亚洲成人aaa| 亚洲直播在线一区| 国产日韩av在线| 色播久久人人爽人人爽人人片视av| 亚洲天堂免费视频| 中文日韩在线视频| 久久久久国产精品www| 国产视频精品va久久久久久| 欧美亚洲午夜视频在线观看| 欧美一级视频免费在线观看| 日韩中文有码在线视频| 日韩av电影中文字幕| 亚洲国产欧美一区| 日韩黄在线观看| 国产精品高清免费在线观看| 一本大道香蕉久在线播放29| 国产日产久久高清欧美一区| 亚洲欧美日韩国产成人| 91免费在线视频网站| 91色中文字幕| 欧美日韩一区二区三区| 日韩精品在线视频| 久久777国产线看观看精品| 欧美第一黄网免费网站| 精品久久久香蕉免费精品视频| 在线中文字幕日韩| 亚洲午夜性刺激影院| 亚洲在线视频福利| 精品亚洲一区二区三区在线观看| 亚洲国产小视频| 精品久久久国产| 国产精品高潮呻吟视频| 欧美性色19p| 国产精品视频精品| 91精品国产91久久久久久最新| 精品激情国产视频| 日韩av电影在线网| 国产精品极品尤物在线观看| 国产国产精品人在线视| 久久亚洲精品一区二区| 亚洲精品久久久久久久久久久| 欧美成人一区二区三区电影| 欧美日韩综合视频|