`
fbxyfszc30000
  • 浏览: 29256 次
社区版块
存档分类
最新评论
阅读更多

    前面一片文章介绍了如何上传和下载文件,这篇文章将介绍一下如何在iOS设备中进行缓存。
这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容。

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

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

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

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

<textarea readonly name="code" class="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]; 

}

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

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

<textarea readonly name="code" class="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(@"请求失败"); 

} </textarea><br>

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

<textarea readonly name="code" class="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] 请求完成

</textarea><br>

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




<table><tbody><tr>
<td class="content"><code class="sql plain">2011-07-30 18:52:18.894 Caching[3971:207] 即将发送请求
</code></td>
</tr></tbody></table>
<div class="line alt2">
<table><tbody><tr>
<td class="content"><code class="sql plain">2011-07-30 18:52:18.895 Caching[3971:207] 将接收输出
</code></td>
</tr></tbody></table>

<div class="line alt1">
<table><tbody><tr>
<td class="content"><code class="sql plain">2011-07-30 18:52:18.895 Caching[3971:207] 接受数据
</code></td>
</tr></tbody></table>

<div class="line alt2">
<table><tbody><tr>
<td class="content"><code class="sql plain">2011-07-30 18:52:18.896 Caching[3971:207] 数据长度为 = 7410
</code></td>
</tr></tbody></table>

<div class="line alt1">
<table><tbody><tr>
<td class="content"><code class="sql plain">2011-07-30 18:52:18.896 Caching[3971:207] 请求完成</code></td>
</tr></tbody></table>

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

总结:本文简单的介绍了一下iOS的内存缓存机制,下一篇文章将重点介绍一下本地缓存机制



 
0
1
分享到:
评论
1 楼 wwwang89 2013-04-18  
楼主,写的太好了,,求demo一份:wwwang89@163.com,O(∩_∩)O谢谢

相关推荐

    iOS开发缓存机制之—内存缓存机制

    在iOS应用开发中,缓存机制扮演着至关重要的角色,它可以显著提高用户体验,减少网络延迟,避免不必要的数据传输。本文主要关注iOS中的内存缓存机制,即如何利用SDK中的`NSURLCache`类来存储和检索数据。 首先,`...

    ios WebView 页面缓存

    1. 内存缓存:内存缓存主要处理短暂的缓存数据,如HTTP响应头中的"Cache-Control: max-age"指定的短时间内有效。内存缓存响应速度快,但受设备内存限制,当内存不足时,缓存会被清理。 2. 磁盘缓存:磁盘缓存通常...

    IOS异步加载缓存图片

    在iOS开发中,异步加载图片缓存是一个关键的技术点,尤其在处理大量图片数据时,如滚动列表或网格视图。这个小例子旨在演示如何有效地实现这一功能,以优化用户体验,避免因为逐个下载图片导致的应用卡顿。以下是...

    iOS app 清除缓存

    在iOS应用开发中,缓存是必不可少的一部分,它能够提高应用程序的性能,减少网络请求,为用户提供更快的体验。然而,随着应用的使用,缓存可能会积累过多,占用设备存储空间,甚至可能导致应用运行缓慢。因此,理解...

    ios-iOS离线缓存.zip

    在iOS应用开发中,离线缓存是一种至关重要的技术,它允许用户在无网络连接时仍然可以访问之前加载过的数据,提升用户体验。本资源“ios-iOS离线缓存.zip”提供了一个名为“OfflineCache”的项目,旨在解决iOS应用中...

    iOS 缓存功能类

    在iOS开发中,缓存是一种重要的技术,用于提高应用程序的性能和用户体验。"iOS 缓存功能类"是一个专门设计来处理iOS应用中字符串和图片缓存的小型、高效工具。下面将详细介绍这类缓存机制及其相关知识点。 一、缓存...

    iOS系统缓存方面开发的相关基础

    总之,iOS系统缓存开发涉及如何有效利用内存和硬盘缓存,以提高应用程序的响应速度和用户体验。通过合理配置`NSURLCache`和选择合适的缓存策略,开发者可以优化网络请求,减少不必要的网络流量,并在离线状态下提供...

    ios 自定义数据缓存

    在iOS开发中,数据缓存是一种常见的技术,用于提高应用性能和用户体验。当用户首次访问数据时,系统会将这些数据存储在本地,以便后续快速访问,而不是每次都从服务器加载。这里我们关注的是通过SQLite来实现自定义...

    iOS中SDWebImage指定缓存图片大小

    在iOS应用开发中,高效的图片加载和管理是用户体验的关键因素之一。SDWebImage是一个非常流行的第三方库,专门用于处理网络图片的下载、缓存以及显示。这个库为开发者提供了便捷的方式来处理图片,避免了因为频繁的...

    ios-iOS AVPlayer 视频缓存.zip

    在iOS开发中,AVPlayer是苹果提供的一种强大的多媒体播放框架,可以用来播放音频和视频。在处理在线视频时,缓存技术是至关重要的,它能让用户在观看视频时获得流畅的体验,即使在网络不稳定或者断开的情况下也能...

    ios-带缓存和风火轮的网络请求,自定义缓存时间,.zip

    在iOS开发中,网络请求是应用与服务器交互的基础,它涉及到数据的获取、解析和展示。本项目"ios-带缓存和风火轮的网络请求,自定义缓存时间.zip"显然关注的是如何高效、智能地处理网络请求,特别是缓存策略的定制。...

    iOS图片缓存

    在iOS开发中,图片缓存是一个非常重要的环节,特别是在处理大量网络图片的场景下,如社交媒体、电商应用等。图片缓存能够显著提高用户体验,减少网络请求,节省流量,并减轻服务器压力。本篇文章将深入探讨iOS图片...

    swift-iOS清除缓存封装

    以下是一个基本的Swift函数,用于清理上述各种类型的缓存: ```swift import Foundation func clearCaches() { // 清理URLCache let cache = URLCache.shared cache.removeAllCachedResponses() // 清理...

    iOS开发之清除缓存功能的实现

    在iOS开发中,缓存管理是一项重要的任务,特别是在处理大量网络资源的应用中,例如图片、视频等。SDWebImage是一个广泛使用的第三方库,它提供了图片的下载和缓存功能。当用户频繁访问网络内容时,缓存能显著提高...

    iOS UIWebView的缓存

    在iOS开发中,UIWebView是苹果提供的一种用于展示网页内容的控件,它允许开发者在应用内部嵌入HTML、CSS和JavaScript代码。然而,当网络条件不佳或者无网络时,UIWebView无法正常加载网页,这可能导致用户体验下降。...

    ios获取相册图片缓存到本地,并取出。

    在iOS开发中,获取相册图片并将其缓存到本地是一项常见的需求,这不仅可以提高应用的性能,还能提供离线访问的能力。以下是如何实现这一功能的详细步骤。 首先,我们需要导入必要的框架。`Photos`框架用于访问用户...

    ios 图片缓存类

    在iOS开发中,图片缓存是一个非常重要的环节,特别是在处理大量图片展示的场景下,如瀑布流、相册浏览等。本项目提供的“ios 图片缓存类”旨在提供一个简单易用的解决方案,利用GCD(Grand Central Dispatch)进行...

    ios-WebView离线缓存.zip

    在iOS开发中,WebView是一种常见的用来展示网页内容的组件,它可以是Safari浏览器的一部分,也可以内嵌在自定义的应用程序中。本项目“ios-WebView离线缓存.zip”主要探讨的是如何利用YYCache和系统提供的...

    iOS App 内存专项实践:封闭系统下的大自由.pdf

    在iOS应用开发中,内存管理是一项至关重要的任务,因为苹果的iOS系统是一个封闭的环境,对应用程序的资源使用有着严格的限制。"iOS App 内存专项实践:封闭系统下的大自由"这一主题深入探讨了如何在这样的环境中有效...

Global site tag (gtag.js) - Google Analytics