文档章节

IOS开发网络加载图片缓存策略之──ASIDownloadCache缓存策略

木木情深
 木木情深
发布于 2014/02/27 21:42
字数 1075
阅读 200
收藏 1

 下面是具体步骤:

一、设置缓存策略

    首先在SplitDemoAppDelegate委托代理中,实现如下代码:

    在SplitDemoAppDelegate.h文件中,代码如下:

 

复制代码

 1 #import <UIKit/UIKit.h>
2
3 @class ASIDownloadCache;
4
5 @interface SplitDemoAppDelegate : NSObject <UIApplicationDelegate,UITabBarControllerDelegate> {
6
7     UIWindow *_window;
8
9     ASIDownloadCache*_downloadCache;            //下载缓存策略
10

11 }
12
13 @property (nonatomic, retain) ASIDownloadCache*downloadCache;
14
15 @end

复制代码

 

在SplitDemoAppDelegate.m文件中,代码如下:


复制代码

 1 #import "SplitDemoAppDelegate.h"
2
3 @implementation SplitDemoAppDelegate
4
5 @synthesize window=_window;
6
7 @synthesize downloadCache = _downloadCache;
8
9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
10
11 {
12
13     //初始化ASIDownloadCache缓存对象
14

15    ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
16
17    self.downloadCache = cache;
18
19   [cache release];
20
21
22    //路径
23

24    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
25
26   NSString *documentDirectory = [paths objectAtIndex:0];
27
28    //设置缓存存放路径
29

30    [self.downloadCache setStoragePath:[documentDirectorystringByAppendingPathComponent:@"resource"]];
31
32    //设置缓存策略
33

34     [self.downloadCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
35
36     // Override point for customization after application launch.
37

38     [self.window makeKeyAndVisible];
39
40     return YES;
41
42 }
43
44
45 - (void)dealloc
46
47 {
48
49     [_window release];
50
51     [_downloadCache release];
52
53    [super dealloc];
54
55 }
56
57 @end

复制代码

 

    二、创建缓存线程

    这一步是创建一个NSOperation类,实现缓存的方法,代码如下:

    ResourceContainer.h文件实现:

 

复制代码

 1 #import <Foundation/Foundation.h>
2
3 #import "ASIHTTPRequest.h"
4
5 #import "SplitDemoAppDelegate.h"
6
7  
8
9 @interface ResourceContainer : NSOperation {
10
11 NSURL*_resourceURL;            //资源请求url
12

13 NSObject*_hostObject;            
14
15 SEL_resourceDidReceive;      //资源接手响应方法  
16

17 SplitDemoAppDelegate*_appDelegate;            //应用委托对象
18

19 ASIHTTPRequest*_httpRequest;            
20
21 UIImageView*_imageView;              
22
23 }
24
25  
26
27 @property (nonatomic, retain) NSURL*resourceURL;
28
29 @property (nonatomic, retain) NSObject*hostObject;
30
31 @property (nonatomic, assign) SELresourceDidReceive;
32
33 @property (nonatomic, assign) SplitDemoAppDelegate   *appDelegate;
34
35 @property (nonatomic, retain) ASIHTTPRequest*httpRequest;
36
37 @property (nonatomic, retain) UIImageView*imageView;
38
39  
40
41 //http请求回调方法
42

43 -(void)didStartHttpRequest:(ASIHTTPRequest *)request;
44
45 -(void)didFinishHttpRequest:(ASIHTTPRequest *)request;
46
47 -(void)didFailedHttpRequest:(ASIHTTPRequest *)request;
48
49  
50
51 //取消资源请求
52

53 -(void)cancelReourceGet;
54
55 //资源接收回调方法
56

57 -(void)resourceDidReceive:(NSData *)resource;
58
59 @end

复制代码

 

ResourceContainer.m文件实现:

复制代码

  
  
  
  ResourceContainer
  resourceURL = _resourceURL;
  hostObject = _hostObject;
  resourceDidReceive = _resourceDidReceive;
  appDelegate = _appDelegate;
  httpRequest = _httpRequest;
  imageView = _imageView;
 
 -()init{
 
      (self == [super init]){
 
      self.appDelegate = (SplitDemoAppDelegate *)[[UIApplication        sharedApplication] ];
 
       }
 
     self;
 
 }
 
 
 -()main{
 
       (self.hostObject == nil)
       ;
 
      (self.resourceURL == nil){
           [self resourceDidReceive:nil];
           ;
      }
 
       ASIHTTPRequest *request = [ASIHTTPRequest     requestWithURL:self.resourceURL]
       self.httpRequest = request;
 
  
 
 [self.httpRequest setDownloadCache:self.appDelegate.downloadCache];
 [self.httpRequest setDelegate:self];
 [self.httpRequest setDidStartSelector:@selector(didStartHttpRequest:)];
 [self.httpRequest setDidFinishSelector:@selector(didFinishHttpRequest:)];
 [self.httpRequest setDidFailSelector:@selector(didFailedHttpRequest:)];
 
      
 [self.httpRequest startAsynchronous];
 
 }
 
 - ()dealloc {
 
 [_resourceURL release];
 [_hostObject release];
 [_httpRequest release];
 [_imageView release];
 [super dealloc];
 
 }
 
  
 -()didStartHttpRequest:(ASIHTTPRequest *)request{
 
 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
 
 }
 
  
 -()didFinishHttpRequest:(ASIHTTPRequest *)request{
 
 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
 
  
 
     ([request responseStatusCode] ==  || [request responseStatusCode] == ){
 
  
         ([request didUseCachedResponse]){
 
 NSLog(,[self.resourceURL absoluteURL]);
 
         }
          {
 
             NSLog();
         }
 
 
      [self resourceDidReceive:[request responseData]];
 
 }
 
  {
 
        [self resourceDidReceive:nil];
 
        }
 
 }
 
  
 -()didFailedHttpRequest:(ASIHTTPRequest *)request{
 
 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
 
 [self resourceDidReceive:nil];
 
 }
 
  
 -()cancelReourceGet{
 
 [self.httpRequest cancel];
 
 }
 
  
 -()resourceDidReceive:(NSData *)resource{
 
 ([self.hostObject respondsToSelector:self.resourceDidReceive]){
 
 (resource != nil && self.imageView != nil){
 
 self.imageView.image = [UIImage imageWithData:resource];
 
 }
 
 
 [self.hostObject performSelectorOnMainThread:self.resourceDidReceive withObject:self.imageViewwaitUntilDone:NO];
 
 }
 
 }

复制代码

 

    到第二步,我们的缓存策略的设置,以及资源请求和接收数据方法已经构建完毕,下面介绍一下如何使用我们上面创建的NSOperation类

 

    三、图片请求(利用上面创建的类)

    这里以我的工程为例进行分析:

在DetailViewController.h声明文件中:

 

复制代码

  <UIKit/UIKit.h>
 
  DetailViewController :UIViewController {
 
     NSURL                         *_imageURL;                     
     NSMutableArray            *_originalIndexArray;         
     NSMutableDictionary     *_originalOperationDic;      
     NSOperationQueue        *_requestImageQueue;     
 }
 
 @property (nonatomic, retain) NSURL                       *imageURL;
 @property (nonatomic, retain) NSMutableArray          *originalIndexArray;
 @property (nonatomic, retain) NSMutableDictionary   *originalOperationDic;
 @property (nonatomic, retain) NSOperationQueue      * requestImageQueue;
 
  
 -()displayProductImage;
 
  
 -()displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url;
 
  
 -()imageDidReceive:(UIImageView *)imageView;

复制代码



 

 在DetailViewController.m实现文件中:

复制代码

  
 
   
 
  DetailViewController
  imageURL = _imageURL;
  originalIndexArray = _originalIndexArray;
  originalOperationDic = _originalOperationDic;
  requestImageQueue = _requestImageQueue;
 
 
 - ()viewDidLoad
 
 {
 
      [super viewDidLoad];
      NSOperationQueue *tempQueue = [[NSOperationQueue alloc] init];
 
      self.requsetImageQueue = tempQueue;
      [tempQueue release];
 
       NSMutableArray *array = [[NSMutableArray alloc] init];
 
       self.originalIndexArray = array;
       [array release];
 
        NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
 
        self.originalOperationDic = dic;
        [dic release];
 
 }
 
  
 -()displayProductImage
 
 {
 
     NSURL *url = [NSURL URLWithString:];
 
      
      imageCount = [self.xxxx.imageNum intValue];
 
      ( i=; i<imageCount; i++) {
 
         NSString *str1 = ;
 
         self.imageURL = [url URLByAppendingPathComponent:str1];
 
          
         [self displayImageByIndex:i ByImageURL:self.productImageURL];
 
     }
 
 }
 
  
 -() displayImageByIndex:(NSInteger)index ByImageURL:(NSURL *)url
 
 {
 
     NSString *indexForString = [NSString stringWithFormat:,index];
 
      
      ([self.originalIndexArray containsObject:indexForString]) {
 
          ;
 
     }
 
      
     UIImageView *imageView = [[UIImageView alloc] init];
 
     imageView.tag = index;
 
      
     ResourceContainer  *imageOperation = [[ResourceContainer alloc] init];
 
     imageOperation.resourceURL = url;
 
     imageOperation.hostObject = self;
 
      
     imageOperation.resourceDidReceive = @selector(imageDidReceive:);
 
     imageOperation.imageView = imageView;
 
     [imageView release];
 
      
     [self.requsetImageQueue addOperation:imageOperation];
 
     [self.originalOperationDic setObject:imageOperation forKey:indexForString];
 
     [imageOperation release];
 
 }
 
  
 -()imageDidReceive:(UIImageView *)imageView
 
 {
 
      (imageView == nil||imageView.image == nil) {
 
             imageView.image = [UIImage imageNamed:];
 
      }
 
      
     [self.openFlowView setImage:imageView.image forIndex:imageView.tag];
 
     [self.originalIndexArray addObject:[NSString stringWithFormat:,imageView.tag]];
 
     [self.originalOperationDic removeObjectForKey:[NSString stringWithFormat:,imageView.tag]];
 
 }
 
 - ()dealloc
 
 {
      [_requestImageQueue release];
 
      [_originalIndexArray release];
 
      [_originalOperationDic release];
 
      [_imageURL release];
 
      [super dealloc];
 
 }

复制代码


    经过上述步骤,我们实现了加载网络图片时缓存功能,增强了用户体验效果。代码中可能会有诸多问题,希望网友指教,有更好的缓存方法,也希望一起交流!


本文转载自:http://www.cnblogs.com/pengyingh/articles/2343061.html

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
ios项目icon和default图片命名规则

一、应用图片 标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源。就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,...

长平狐
2013/12/25
533
0
【PhoneGap】环境安装配置浅析

由于项目需要,需要了解PhoneGap架构以其在各个平台的环境配置,阅读了官网部分文档,总结如下。 【官网地址】 http://phonegap.com/ 【环境配置】 参考: http://phonegap.com/install/ 1. ...

嘻哈开发者
2015/01/18
0
0
冯森林:手机淘宝中的那些Web技术

Native APP与Web APP的技术融合已经逐渐成为一种趋势,使用标准的Web技术来开发应用中的某些功能,不仅可以降低开发成本,同时还可以方便的进行功能迭代更新。但是如何保证Web APP的流畅性也...

GIFCOOL
2015/11/06
0
0
iOS ASIHTTPRequest详解

ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于R...

青云_K
2013/01/09
0
0
(转)ASIHTTPRequest类库简介和使用说明

官方网站: http://allseeing-i.com/ASIHTTPRequest/ 。 可以从上面下载到最新源码,以及获取到相关的资料。 使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一...

ioser
2011/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:线程间频繁切换为什么耗费资源?

因为线程切换的时候,CPU需要将此线程的所有执行状态保存起来,如线程编号,执行到的位置等,然后再去执行其它线程。

浮躁的码农
35分钟前
2
0
PHP版本高于5.5时,curl文件上传必须使用CurlFile对象

坑了我一天,之前@的方法各种上传不成功文件。都怀疑服务端有bug了。

叫我哀木涕
36分钟前
1
0
js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a1+(a1+d*n))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q->公......

祖达
今天
2
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
今天
2
0
好文 | MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 ...

Java爬坑之路
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部