`
lizaochengwen
  • 浏览: 644514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS上使用缓存,使程序高效运行。

阅读更多
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。

内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。

1、NSURLRequestUseProtocolCachePolicy NSURLRequest默认的cache policy,使用Protocol协议定义。
2、NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载。
3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载。
4、NSURLRequestReturnCacheDataDontLoad 只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。
6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。下面我通过一个例子来说明,这个例子减少我们对同一个url多次请求。看下面代码:
Plain代码

   
-(IBAction) buttonPress:(id) sender    
      
    {    
      
        NSString *paramURLAsString= @"http://www.baidu.com/";    
      
        if ([paramURLAsString length] == 0){    
      
            NSLog(@"Nil or empty URL is given");    
      
            return;    
      
        }    
      
        NSURLCache *urlCache = [NSURLCache sharedURLCache];    
      
        /* 设置缓存的大小为1M*/   
      
        [urlCache setMemoryCapacity:1*1024*1024];    
      
         //创建一个nsurl    
      
        NSURL *url = [NSURL URLWithString:paramURLAsString];    
      
            //创建一个请求    
      
        NSMutableURLRequest *request =    
      
        [NSMutableURLRequest   
      
         requestWithURL:url    
      
         cachePolicy:NSURLRequestUseProtocolCachePolicy   
      
         timeoutInterval:60.0f];    
      
         //从请求中获取缓存输出    
      
        NSCachedURLResponse *response =    
      
        [urlCache cachedResponseForRequest:request];    
      
        //判断是否有缓存    
      
        if (response != nil){    
      
            NSLog(@"如果有缓存输出,从缓存中获取数据");    
      
            [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];    
      
        }    
      
        self.connection = nil;    
      
        /* 创建NSURLConnection*/   
      
        NSURLConnection *newConnection =    
      
        [[NSURLConnection alloc] initWithRequest:request    
      
                                        delegate:self   
      
                                startImmediately:YES];    
      
        self.connection = newConnection;    
      
        [newConnection release];    
      
    }   


这个例子中,我们请求url为www.baidu.com的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从www.baidu.com站点上重新获取数据。我们设置了缓存大小为1M。

使用下面代码,我将请求的过程打印出来:
Plain代码

   
- (void)  connection:(NSURLConnection *)connection    
      
      didReceiveResponse:(NSURLResponse *)response{    
      
        NSLog(@"将接收输出");    
      
    }    
      
    - (NSURLRequest *)connection:(NSURLConnection *)connection    
      
                 willSendRequest:(NSURLRequest *)request    
      
                redirectResponse:(NSURLResponse *)redirectResponse{    
      
        NSLog(@"即将发送请求");    
      
        return(request);    
      
    }    
      
    - (void)connection:(NSURLConnection *)connection    
      
        didReceiveData:(NSData *)data{    
      
        NSLog(@"接受数据");    
      
        NSLog(@"数据长度为 = %lu", (unsigned long)[data length]);    
      
    }    
      
    - (NSCachedURLResponse *)connection:(NSURLConnection *)connection    
      
                      willCacheResponse:(NSCachedURLResponse *)cachedResponse{    
      
        NSLog(@"将缓存输出");    
      
        return(cachedResponse);    
      
    }    
      
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection{    
      
        NSLog(@"请求完成");    
      
    }    
      
    - (void)connection:(NSURLConnection *)connection    
      
      didFailWithError:(NSError *)error{    
      
        NSLog(@"请求失败");    
      
    }   


当我们第一次点击界面上的按钮,打印的结果如下:
Html代码

  
 2011-07-30 18:50:24.910 Caching[3971:207] 即将发送请求    
      
    2011-07-30 18:50:28.557 Caching[3971:207] 将接收输出    
      
    2011-07-30 18:50:31.677 Caching[3971:207] 接受数据    
      
    2011-07-30 18:50:31.681 Caching[3971:207] 数据长度为 = 4414    
      
    2011-07-30 18:50:31.682 Caching[3971:207] 接受数据    
      
    2011-07-30 18:50:31.682 Caching[3971:207] 数据长度为 = 2996    
      
    2011-07-30 18:50:38.107 Caching[3971:207] 将缓存输出    
      
    2011-07-30 18:50:38.109 Caching[3971:207] 请求完成
  


在看我们第二次点击界面上的按钮,打印结果如下:

2011-07-30 18:52:18.894 Caching[3971:207] 即将发送请求
2011-07-30 18:52:18.895 Caching[3971:207] 将接收输出
2011-07-30 18:52:18.895 Caching[3971:207] 接受数据
2011-07-30 18:52:18.896 Caching[3971:207] 数据长度为 = 7410
2011-07-30 18:52:18.896 Caching[3971:207] 请求完成


我们看到没有“将缓存输出”一项,请求到的数据是第一次请求的累积,也就是第二次是从内存中获取数据的。
分享到:
评论

相关推荐

    iOS中的NSURLCache数据缓存类用法解析

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。下面将介绍如何在IOS设备中进行缓存。  内存缓存我们...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    安卓上用于加载的Webview视图窗口只是作为类浏览器而存在,在安卓上更是只能同时运行一个Webview。(2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备...

    JAVA上百实例源码以及开源项目

    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...

    JAVA上百实例源码以及开源项目源代码

    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...

    java开源包8

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包1

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包11

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包2

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包3

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包6

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包5

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包10

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包4

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包7

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包9

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java开源包101

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    Java资源包01

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    国人开发的自动构建工具 XMake.zip

    XMake 是一个跨平台自动构建工具,支持在各种主流平台上构建项目,类似 cmake、automake、premake,但是更加的方便易用,工程描述语法更简洁直观,支持平台更多,并且集创建、配置、编译、打包、安装、卸载、运行于...

    PHP云人才系统(phpyun) v3.2 build141231.rar

    PHP云人才系统是一个采用 PHP 和 MySQL 数据库构建的高效开源的人才与企业求职招、聘解决方案,在尊重版权的前提下能极大的满足站长对于网站程序进行二次开发。PHP云人才系统作为一款拥有自主知识产权的中文人才运营...

Global site tag (gtag.js) - Google Analytics