




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】如何在IOS中加載大量的網(wǎng)絡(luò)圖片
這篇文章給大家介紹如何在IOS中加載大量的網(wǎng)絡(luò)圖片,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。1、概述在IOS下通過(guò)URL讀一張網(wǎng)絡(luò)圖片并不像其他編程語(yǔ)言那樣可以直接把圖片路徑放到圖片路徑的位置就ok,而是需要我們通過(guò)一段類似流的方式去加載網(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í)的效果與用戶體驗(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
=
;
//設(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):依賴的庫(kù)很少,功能全面。自動(dòng)實(shí)現(xiàn)磁盤(pán)緩存:緩存圖片名字是以MD5進(jìn)行加密的后的名字進(jìn)行命名.(因?yàn)榧用苣嵌炎执俏ㄒ坏?加載網(wǎng)絡(luò)圖片時(shí)直接設(shè)置占位圖片:[imageViewsd_setImageWithURL:imageurl
placeholderImage:[UIImageimageNamed:@”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
=
;
//設(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ù)下載圖像
*SDWebIm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鋅系常溫磷化液市場(chǎng)運(yùn)營(yíng)現(xiàn)狀與發(fā)展前景分析報(bào)告
- 2025-2030年中國(guó)釩鐵行業(yè)市場(chǎng)經(jīng)營(yíng)狀況及投資戰(zhàn)略研究報(bào)告
- 2025江西省安全員B證(項(xiàng)目經(jīng)理)考試題庫(kù)
- 2025-2030年中國(guó)軟體家具市場(chǎng)運(yùn)行態(tài)勢(shì)及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)貝復(fù)舒行業(yè)前景展望及未來(lái)投資規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)蛋品加工市場(chǎng)運(yùn)營(yíng)狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)管道管產(chǎn)業(yè)前景趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)硅酸鈣板行業(yè)運(yùn)行動(dòng)態(tài)與營(yíng)銷策略研究報(bào)告
- 2025上海市建筑安全員-A證考試題庫(kù)及答案
- 吉林建筑大學(xué)《教師教學(xué)行為研究》2023-2024學(xué)年第二學(xué)期期末試卷
- lm3s8962開(kāi)發(fā)板用戶手冊(cè)
- IATF16949-過(guò)程審核檢查表-(含審核記錄)-
- 食品防護(hù)評(píng)估表
- 編輯出版史考試重點(diǎn)整理
- (74)-17.3手性高效液相色譜法
- 淺談新生兒肺透明膜病的影像學(xué)診斷
- SMT失效模式分析PFMEA
- 國(guó)際貿(mào)易地理全套課件
- 家校共育-助孩子成長(zhǎng)-家長(zhǎng)會(huì)課件
- 叉形件工藝及車(chē)床夾具設(shè)計(jì)說(shuō)明書(shū)
- GB/T 5916-2008產(chǎn)蛋后備雞、產(chǎn)蛋雞、肉用仔雞配合飼料
評(píng)論
0/150
提交評(píng)論