`

iOS开发之缓存:内存缓存

    博客分类:
  • 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类似。
6NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

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

-(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。

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

- (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(@"请求失败");
}

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

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开发缓存机制之—内存缓存机制

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

    iOS 缓存功能类

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

    ios 自定义数据缓存

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

    iOS中SDWebImage指定缓存图片大小

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

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

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

    swift-iOS清除缓存封装

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

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

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

    iOS图片缓存

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

    iOS UIWebView的缓存

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

    ios-清除缓存.zip

    一、iOS缓存类型 1. 文件系统缓存:iOS应用通常会将数据存储为文件,包括图片、JSON数据、数据库文件等。这些文件会被保存在应用的沙盒目录下,如Documents、Library/Caches或tmp目录。 2. NSURLCache:网络请求的...

    ios-WebView离线缓存.zip

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

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

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

    ios 图片缓存类

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

    ios应用源码之加载器(当下载或加载缓存时候用的进度条) 2018127

    在iOS应用开发中,加载器(Loader)是用户体验的重要组成部分,特别是在进行数据下载或加载缓存时,一个良好的进度条可以提升用户对等待过程的感知,降低其不耐烦感。这个“ios应用源码之加载器(当下载或加载缓存...

    ios-缓存.zip

    在iOS开发中,数据持久化是一项重要的技术,用于在应用关闭或设备重启后保存和恢复数据。本项目“ios-缓存.zip”提供了一个简单封装的归档与反归档工具类,它针对网络请求场景进行了优化,可以处理有网络和无网络两...

Global site tag (gtag.js) - Google Analytics