iOS開發實踐之cell下載圖片(SDWebImage)

來源:互聯網
上載者:User

iOS開發實踐之cell下載圖片(SDWebImage)

前兩篇是自己寫的下載圖片方法,現在用第三方架構只要幾行代碼就可以實現圖片的下載。SDWebImage底層實現的思路也是和前面說的一樣。 SDWebImage是網狀圖片處理架構,封裝很很多方法,例如:圖片下載、圖片緩衝、下載進度監聽、gif處理等等。大大提高了網狀圖片處理的效率。值得使用。

github託管地址:https://github.com/rs/SDWebImage

實現cell圖片下載之前,先瞭解一下SDWebImage的使用:

1、匯入架構,引入標頭檔:

#import "UIImageView+WebCache.h"

2、圖片下載並緩衝方法:

UIImageView+WebCache.h

//得到當前圖片的url- (NSURL *)sd_imageURL;/** * 非同步下載圖片並緩衝 */- (void)sd_setImageWithURL:(NSURL *)url;/** * 非同步下載圖片並緩衝,沒下載完之前先顯示佔位圖片,下載完之後再替換 */- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;/** * 非同步下載圖片並緩衝 * @param url           下載圖片路徑 * @param placeholder   佔位圖片,直到下載完成才替換 * @param options       下載圖片選擇方式 */- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;/** * 非同步下載圖片並緩衝,完成後可以在block中做事情 * @param url           下載圖片url * @param completedBlock    SDWebImageCompletionBlock:UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)  block中可以得到下載圖片,錯誤資訊,緩衝類型,下載圖片地址  參數,給使用者做相應操作 */- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock;/** * 非同步下載圖片並緩衝,提供佔位圖片,並完成後可以在block中做事情 * * @param url            T下載圖片url * @param placeholder    T佔位圖片,直到下載完成才替換 * @param completedBlock SDWebImageCompletionBlock:UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) block中可以得到下載圖片,錯誤資訊,緩衝類型,下載圖片地址  參數,給使用者做相應操作 */- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;/** * 非同步下載圖片並緩衝,完成後可以在block中做事情 * @param url           下載圖片路徑 * @param placeholder   佔位圖片,直到下載完成才替換 * @param options       下載圖片選擇方式 * @param completedBlock  同上 */- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;/** * 非同步下載圖片並緩衝,可以監聽下載進度,完成後可以在block中做事情 * @param url           下載圖片路徑 * @param placeholder   佔位圖片,直到下載完成才替換 * @param options       下載圖片選擇方式 * @param progress * SDWebImageDownloaderProgressBlock:NSInteger receivedSize(當前下載大小), NSInteger expectedSize(總大小) * @param completedBlock  同上 */- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;/** * 非同步下載圖片並緩衝,可以監聽下載進度,完成後可以在block中做事情 * @param url           下載圖片路徑 * @param placeholder   佔位圖片,直到下載完成才替換 * @param options       下載圖片選擇方式 * @param progress * SDWebImageDownloaderProgressBlock:NSInteger receivedSize(當前下載大小), NSInteger expectedSize(總大小) * @param completedBlock  同上 */- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

3、options所有選項

 //失敗後重新下載    SDWebImageRetryFailed = 1 << 0,    //最低優先順序,當進行中UI互動時,自動暫停內部的一些下載操作    SDWebImageLowPriority = 1 << 1,    //只緩衝記憶體    SDWebImageCacheMemoryOnly = 1 << 2,    //漸進式下載,顯示的映像是逐步在下載    SDWebImageProgressiveDownload = 1 << 3,    //重新整理緩衝    SDWebImageRefreshCached = 1 << 4,    //後台下載    SDWebImageContinueInBackground = 1 << 5,    /**     * Handles cookies stored in NSHTTPCookieStore by setting     * NSMutableURLRequest.HTTPShouldHandleCookies = YES;     */    SDWebImageHandleCookies = 1 << 6,    //允許使用無效的SSL認證    SDWebImageAllowInvalidSSLCertificates = 1 << 7,    //高優先順序下載    SDWebImageHighPriority = 1 << 8,        //延遲預留位置    SDWebImageDelayPlaceholder = 1 << 9,    //改變動畫形象    SDWebImageTransformAnimatedImage = 1 << 10,        /**     * By default, image is added to the imageView after download. But in some cases, we want to     * have the hand before setting the image (apply a filter or add it with cross-fade animation for instance)     * Use this flag if you want to manually set the image in the completion when success     */    SDWebImageAvoidAutoSetImage = 1 << 11

4、記憶體處理:當app接收到記憶體警告時,我們要釋放記憶體。
 SDWebImageManager *manager = [SDWebImageManager sharedManager];        // 取消正在下載的操作   [manager cancelAll];        // 清除記憶體緩衝    [manager.imageCache clearMemory];        //釋放磁碟的緩衝    [manager.imageCache cleanDisk];

上面只是實現圖片下載的方法和使用步驟而已,SDWebImage還要很多強大的功能,如本機快取引入SDImageCache.h,SDImageCache檔案裡面可以看到它提供了很多方法,並可以設定緩衝的時間(預設一個星期),緩衝大小等等。具體用到我們看一下相應的標頭檔提高的方法即可,這裡不一一詳述。

cell下載圖片(SDWebImage) demo:

////  AppsViewController.m//  cell圖片下載-SDWebImage//#import "AppsViewController.h"#import "App.h"#import "UIImageView+WebCache.h"@interface AppsViewController ()@property(nonatomic,strong) NSArray *apps;@end@implementation AppsViewController- (void)viewDidLoad {    [super viewDidLoad];  }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}-(NSArray *)apps{    if (!_apps) {        NSMutableArray *appArr = [NSMutableArray array];        NSString *file = [[NSBundle mainBundle]pathForResource:@"apps" ofType:@"plist"];        NSArray *dictArr = [NSArray arrayWithContentsOfFile:file];        for (NSDictionary *dict in dictArr) {            App *app = [App appWithDict:dict];            [appArr addObject:app];        }        _apps = appArr;    }    return _apps;}#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {    return 1;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    return self.apps.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    static NSString *ID = @"app";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];    if (!cell) {        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];    }        App *app = self.apps[indexPath.row];    cell.textLabel.text = app.name;    cell.detailTextLabel.text = app.download;           //下載圖片    NSURL *url = [NSURL URLWithString:app.icon];    //[cell.imageView sd_setImageWithURL:url];    //[cell.imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];        //[cell.imageView sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {     //   NSLog(@"%@",imageURL);    //}];        //SDWebImage下載圖片    SDWebImageOptions options = SDWebImageRetryFailed | SDWebImageLowPriority;    [cell.imageView sd_setImageWithPreviousCachedImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"] options:options progress:^(NSInteger receivedSize, NSInteger expectedSize) {        NSLog(@"下載進度:%f",(double)receivedSize/expectedSize);    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {        NSLog(@"下載圖片完成%@",image);    }];          return cell;}@end
注意:app接收到記憶體警告時,要釋放記憶體。 整個程式的要實現警告釋放記憶體,因此在AppDelegate.m 的applicationDidReceiveMemoryWarning方法中釋放。
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application{    SDWebImageManager *manager = [SDWebImageManager sharedManager];        // 1.取消正在下載的操作   [manager cancelAll];        // 2.清除記憶體緩衝    [manager.imageCache clearMemory];}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.