最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS開(kāi)發(fā)中加載大量網(wǎng)絡(luò)圖片優(yōu)化方法

 更新時(shí)間:2017年03月30日 09:11:02   投稿:lqh  
這篇文章主要介紹了IOS開(kāi)發(fā)中加載大量網(wǎng)絡(luò)圖片如何優(yōu)化的相關(guān)資料,需要的朋友可以參考下

IOS開(kāi)發(fā)中加載大量網(wǎng)絡(luò)圖片如何優(yōu)化

1、概述

在IOS下通過(guò)URL讀一張網(wǎng)絡(luò)圖片并不像其他編程語(yǔ)言那樣可以直接把圖片路徑放到圖片路徑的位置就ok,而是需要我們通過(guò)一段類(lèi)似流的方式去加載網(wǎng)絡(luò)圖片,接著才能把圖片放入圖片路徑顯示。比如:

-(UIImage *) getImageFromURL:(NSString *)fileURL {
 //NSLog(@"執(zhí)行圖片下載函數(shù)");  
 UIImage * result;  
 NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
 result = [UIImage imageWithData:data];  
 return result;
}

加載網(wǎng)絡(luò)圖片可以說(shuō)是網(wǎng)絡(luò)應(yīng)用中必備的。如果單純的去下載圖片,而不去做多線程、緩存等技術(shù)去優(yōu)化,加載圖片時(shí)的效果與用戶(hù)體驗(yàn)就會(huì)很差。

優(yōu)化思路為:

(1)本地緩存

(2)異步加載

(3)加載完畢前使用占位圖片

2、優(yōu)化方法

方法1:用NSOperation開(kāi)異步線程下載圖片,當(dāng)下載完成時(shí)替換占位圖片

#import "XNViewController.h"
#import "XNApp.h"

@interface XNViewController ()
@property (nonatomic, strong) NSArray *appList;
@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation XNViewController
#pragma mark - 懶加載

- (NSOperationQueue *)queue {
 if (!_queue) _queue = [[NSOperationQueue alloc] init];
 return _queue;
}

//可抽取出來(lái)寫(xiě)到模型中
- (NSArray *)appList {
 if (!_appList) {
 //1.加載plist到數(shù)組中
 NSURL *url = [[NSBundle mainBundle] URLForResource:@"apps.plist" withExtension:nil];
 NSArray *array = [NSArray arrayWithContentsOfURL:url];
 //2.遍歷數(shù)組
 NSMutableArray *arrayM = [NSMutableArray array];
 [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
   [arrayM addObject:[XNApp appWithDict:obj]]; //數(shù)組中存放的是字典, 轉(zhuǎn)換為app對(duì)象后再添加到數(shù)組
 }];
 _appList = [arrayM copy];
 }
 return _appList;
}

- (void)viewDidLoad {
 [super viewDidLoad];

 self.tableView.rowHeight = 88;

//  NSLog(@"appList-%@",_appList);
}

#pragma mark - 數(shù)據(jù)源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 return self.appList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *ID = @"Cell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

 //用模型來(lái)填充每個(gè)cell
 XNApp *app = self.appList[indexPath.row];
 cell.textLabel.text = app.name; //設(shè)置文字

 //設(shè)置圖像: 模型中圖像為nil時(shí)用默認(rèn)圖像,并下載圖像. 否則用模型中的內(nèi)存緩存圖像.
 if (!app.image) {
 cell.imageView.image = [UIImage imageNamed:@"user_default"];

 [self downloadImg:indexPath];
 }
 else {
 //直接用模型中的內(nèi)存緩存
 cell.imageView.image = app.image;
 }
// NSLog(@"cell--%p", cell);

 return cell;
}

/**始終記住, 通過(guò)模型來(lái)修改顯示. 而不要試圖直接修改顯示*/
- (void)downloadImg:(NSIndexPath *)indexPath {
 XNApp *app = self.appList[indexPath.row]; //取得改行對(duì)應(yīng)的模型

 [self.queue addOperationWithBlock: ^{
   NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數(shù)據(jù)
   UIImage *image = [UIImage imageWithData:imgData];

   //在主線程中更新UI
   [[NSOperationQueue mainQueue] addOperationWithBlock: ^{
     //通過(guò)修改模型, 來(lái)修改數(shù)據(jù)
     app.image = image;
     //刷新指定表格行
     [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
 }];
 }];
}

@end

上述代碼只是做了內(nèi)存緩存,還沒(méi)有做本地緩存,因?yàn)檫@里這種方法不是重點(diǎn),也不是首選方法。上面代碼每次重新進(jìn)入應(yīng)用時(shí),還會(huì)從網(wǎng)上重新下載。如果要繼續(xù)優(yōu)化上面的代碼,需要自己去實(shí)現(xiàn)本地緩存。

方法2:使用第三方框架SDWebImage

特點(diǎn):

依賴(lài)的庫(kù)很少,功能全面。

自動(dòng)實(shí)現(xiàn)磁盤(pán)緩存:緩存圖片名字是以MD5進(jìn)行加密的后的名字進(jìn)行命名.(因?yàn)榧用苣嵌炎执俏ㄒ坏?

加載網(wǎng)絡(luò)圖片時(shí)直接設(shè)置占位圖片:[imageView sd_setImageWithURL:imageurl  placeholderImage:[UIImage imageNamed:@”xxxxx”]]。

就一個(gè)方法就實(shí)現(xiàn)了多線程\帶緩沖等效果.(可用帶參數(shù)的方法,具體可看頭文件)

用SDWebImage修改上面的方法后的代碼可簡(jiǎn)化為:

#pragma mark - 數(shù)據(jù)源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 return self.appList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *ID = @"Cell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

 //用模型來(lái)填充每個(gè)cell
 XNApp *app = self.appList[indexPath.row];
 cell.textLabel.text = app.name; //設(shè)置文字

// //設(shè)置圖像: 模型中圖像為nil時(shí)用默認(rèn)圖像,并下載圖像. 否則用模型中的內(nèi)存緩存圖像.
// if (!cell.imageView.image) {
// cell.imageView.image = [UIImage imageNamed:@"user_default"];
//
// [self downloadImg:indexPath];
// }
// else {
// //直接用模型中的內(nèi)存緩存
// cell.imageView.image = app.image;
// }


 //使用SDWebImage來(lái)完成上面的功能. 針對(duì)ImageView.
 //一句話, 自動(dòng)實(shí)現(xiàn)了異步下載. 圖片本地緩存. 網(wǎng)絡(luò)下載. 自動(dòng)設(shè)置占位符.
 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"user_default"]];


 return cell;
}

/**始終記住, 通過(guò)模型來(lái)修改顯示. 而不要試圖直接修改顯示*/
//- (void)downloadImg:(NSIndexPath *)indexPath {
// XNApp *app = self.appList[indexPath.row]; //取得改行對(duì)應(yīng)的模型
//
// [self.queue addOperationWithBlock: ^{
//   NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數(shù)據(jù)
//   UIImage *image = [UIImage imageWithData:imgData];
//
//   //在主線程中更新UI
//   [[NSOperationQueue mainQueue] addOperationWithBlock: ^{
//     //通過(guò)修改模型, 來(lái)修改數(shù)據(jù)
//     app.image = image;
//     //刷新指定表格行
//     [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
// }];
// }];
//}

@end

【備注】SDWebImage中的一些參數(shù):

*SDWebImageRetryFailed = 1<< 0,  默認(rèn)選項(xiàng),失敗后重試

*SDWebImageLowPriority = 1<< 1,  使用低優(yōu)先級(jí)

*SDWebImageCacheMemoryOnly = 1<< 2,  僅僅使用內(nèi)存緩存

*SDWebImageProgressiveDownload = 1<< 3,  顯示現(xiàn)在進(jìn)度

*SDWebImageRefreshCached = 1<< 4,  刷新緩存

*SDWebImageContinueInBackground =1 << 5,  后臺(tái)繼續(xù)下載圖像

*SDWebImageHandleCookies = 1<< 6,  處理Cookie

*SDWebImageAllowInvalidSSLCertificates= 1 << 7,  允許無(wú)效的SSL驗(yàn)證

*SDWebImageHighPriority = 1<< 8,   高優(yōu)先級(jí)

*SDWebImageDelayPlaceholder = 1<< 9   延遲顯示占位圖片



感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 詳解Objective C 中Block如何捕獲外部值

    詳解Objective C 中Block如何捕獲外部值

    這篇文章主要為大家介紹了詳解Objective C 中Block如何捕獲外部值實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 如何使用IOS實(shí)現(xiàn)WIFI傳輸

    如何使用IOS實(shí)現(xiàn)WIFI傳輸

    這篇文章主要介紹了如何使用IOS實(shí)現(xiàn)WIFI傳輸,對(duì)局域網(wǎng)傳輸和HTTP感興趣的同學(xué),可以參考下
    2021-04-04
  • iOS9新特性之UIStackView

    iOS9新特性之UIStackView

    UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。下面通過(guò)本文給大家介紹iOS9新特性之UIStackView的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-09-09
  • IOS中內(nèi)存管理那些事

    IOS中內(nèi)存管理那些事

    這篇文章主要介紹了IOS中內(nèi)存管理那些事的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • 分享一些iOS開(kāi)發(fā)實(shí)用的小技巧

    分享一些iOS開(kāi)發(fā)實(shí)用的小技巧

    這篇文章主要給大家分享了一些iOS開(kāi)發(fā)實(shí)用的小技巧,這些小技巧在大家開(kāi)發(fā)iOS的時(shí)候還是相當(dāng)實(shí)用,有需要的朋友們下面來(lái)一起看看吧。
    2016-09-09
  • iOS實(shí)現(xiàn)雷達(dá)掃描效果

    iOS實(shí)現(xiàn)雷達(dá)掃描效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)雷達(dá)掃描效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • iOS開(kāi)發(fā)之清除緩存功能的實(shí)現(xiàn)

    iOS開(kāi)發(fā)之清除緩存功能的實(shí)現(xiàn)

    現(xiàn)在的絕大多數(shù)應(yīng)用中都存在著清楚緩存的功能,形形色色,各有千秋,所以小編現(xiàn)為大家介紹一種最基礎(chǔ)的清除緩存的方法,有需要的可以參考借鑒。下面來(lái)一起看看吧。
    2016-09-09
  • iOS中searchBar(搜索框)光標(biāo)初始位置后移

    iOS中searchBar(搜索框)光標(biāo)初始位置后移

    這篇文章主要介紹了iOS中searchBar(搜索框)光標(biāo)初始位置后移的關(guān)鍵代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • 輕松搞定iOS本地消息推送

    輕松搞定iOS本地消息推送

    這篇文章主要幫助大家輕松搞定iOS本地消息推送,iOS中使用本地通知為你的APP添加提示用戶(hù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 僅幾行iOS代碼限制TextField輸入長(zhǎng)度

    僅幾行iOS代碼限制TextField輸入長(zhǎng)度

    這篇文章主要為大家詳細(xì)介紹了通過(guò)幾行iOS代碼限制TextField輸入長(zhǎng)度的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論

垣曲县| 瑞丽市| 巴东县| 黄浦区| 象州县| 吉隆县| 象山县| 甘洛县| 根河市| 沙湾县| 阿克陶县| 闻喜县| 晋宁县| 且末县| 轮台县| 宜丰县| 涟源市| 邮箱| 石阡县| 黎川县| 浦县| 凌海市| 江西省| 桐城市| 德兴市| 寻乌县| 门源| 邵阳市| 新田县| 塔城市| 六枝特区| 阳江市| 太白县| 三穗县| 洪江市| 驻马店市| 长汀县| 从化市| 乐山市| 满城县| 丰台区|