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

 下面是具体步骤:

一、设置缓存策略

    首先在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];
 
 }

复制代码


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


转载于:https://my.oschina.net/starmier/blog/203763

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值