iOS - LocalCache 本地数据缓存

1、自定义方式本地数据缓存

1.1 自定义缓存 1

  • 沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视频文件等。该目录中的文件系统不会自动删除,可以做离线访问。它的存放时间比 tmp 下的长,但是不如 Library 下的其它目录。总的来说 Caches 目录下存放的数据不能是应用程序运行所必需的,但是能提高应用访问性能的。可写入应用支持文件,保存应用程序再次启动需要的信息。iTunes 不会对这个目录的内容进行备份。要求程序员必需提供一个完善的清除缓存目录的 "解决方案"。
  • Objective-C
        // 写缓存
    
            - (void)writeLocalCacheData:(NSData *)data withKey:(NSString *)key {
    
                // 设置存储路径
                NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]
                                                                                     stringByAppendingPathComponent:key];
    
                // 判读缓存数据是否存在
                if ([[NSFileManager defaultManager] fileExistsAtPath:cachesPath]) {
    
                    // 删除旧的缓存数据
                    [[NSFileManager defaultManager] removeItemAtPath:cachesPath error:nil];
                }
    
                // 存储新的缓存数据
                [data writeToFile:cachesPath atomically:YES];
            }
    
        // 读缓存
    
            - (NSData *)readLocalCacheDataWithKey:(NSString *)key {
    
                NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]
                                                                                     stringByAppendingPathComponent:key];
    
                // 判读缓存数据是否存在
                if ([[NSFileManager defaultManager] fileExistsAtPath:cachesPath]) {
    
                    // 读取缓存数据
                    return [NSData dataWithContentsOfFile:cachesPath];
                }
    
                return nil;
            }
    
        // 删缓存
    
            - (void)deleteLocalCacheDataWithKey:(NSString *)key {
    
                NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]
                                                                                     stringByAppendingPathComponent:key];
    
                // 判读缓存数据是否存在
                if ([[NSFileManager defaultManager] fileExistsAtPath:cachesPath]) {
    
                    // 删除缓存数据
                    [[NSFileManager defaultManager] removeItemAtPath:cachesPath error:nil];
                }
            }
  • Swift
        // 写缓存
    
            func writeLocalCacheData(data:NSData, withKey key:String) {
    
                // 设置存储路径
                let cachesPath = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0]
                                 .stringByAppendingString("/\(key)")
    
                // 判读缓存数据是否存在
                if NSFileManager.defaultManager().fileExistsAtPath(cachesPath) {
    
                    // 删除旧的缓存数据
                    try! NSFileManager.defaultManager().removeItemAtPath(cachesPath)
                }
    
                // 存储新的缓存数据
                data.writeToFile(cachesPath, atomically: true)
            }
    
        // 读缓存
    
            func readLocalCacheDataWithKey(key:String) -> NSData? {
    
                let cachesPath = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0]
                                 .stringByAppendingString("/\(key)")
    
                // 判读缓存数据是否存在
                if NSFileManager.defaultManager().fileExistsAtPath(cachesPath) {
    
                    // 读取缓存数据
                    return NSData(contentsOfFile: cachesPath)
                }
    
                return nil
            }
    
        // 删缓存
    
            func deleteLocalCacheDataWithKey(key:String) {
    
                let cachesPath = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0]
                                 .stringByAppendingString("/\(key)")
    
                // 判读缓存数据是否存在
                if NSFileManager.defaultManager().fileExistsAtPath(cachesPath) {
    
                    // 删除缓存数据
                    try! NSFileManager.defaultManager().removeItemAtPath(cachesPath)
                }
            }

1.2 自定义缓存 2

  • 沙盒路径下的 Library/Preferences 常用来放置配置文件、数据文件、模板等应用在运行中与用户相关,而又希望对用户不可见的文件,如系统偏好设置,用户偏好设置等文件。使用 NSUserDefaults 类进行偏好设置文件的创建、读取和修改。
  • Objective-C
        // 写缓存
    
            - (void)saveCacheData:(NSData *)data withType:(int)type andID:(int)_id {
    
                NSUserDefaults *setting = [NSUserDefaults standardUserDefaults];
                NSString *key = [NSString stringWithFormat:@"detail-%d-%d", type, _id];
    
                [setting setObject:data forKey:key];
                [setting synchronize];
            }
    
        // 读缓存
    
            - (NSData *)getCacheDataWithType:(int)type andID:(int)_id {
    
                NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
                NSString *key = [NSString stringWithFormat:@"detail-%d-%d", type, _id];
    
                return [setting objectForKey:key];
            }
    
        // 删缓存
    
            - (void)removeCacheDataWith:(int)type andID:(int)_id {
    
                NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
                NSString *key = [NSString stringWithFormat:@"detail-%d-%d", type, _id];
    
                [setting removeObjectForKey:key];
                [setting synchronize];
            }
  • Swift
        // 写缓存
    
            func saveCacheData(data:NSData, withType type:Int, andID _id:Int) {
    
                let setting = NSUserDefaults.standardUserDefaults()
                let key = String(format: "detail-%d-%d", type, _id)
    
                setting.setObject(data, forKey: key)
                setting.synchronize()
            }
    
        // 读缓存
    
            func getCacheDataWithType(type:Int, andID _id:Int) -> NSData? {
    
                let setting = NSUserDefaults.standardUserDefaults()
                let key = String(format: "detail-%d-%d", type, _id)
    
                return setting.objectForKey(key) as? NSData
            }
    
        // 删缓存
    
            func removeCacheDataWithType(type:Int, andID _id:Int) {
    
                let setting = NSUserDefaults.standardUserDefaults()
                let key = String(format: "detail-%d-%d", type, _id)
    
                setting.removeObjectForKey(key)
                setting.synchronize()
            }   

2、EGOCache 方式本地数据缓存

  • EGOCache 一个简单、线程安全的基于 key-value 的缓存框架,原生支持 NSString、UI/NSImage、和 NSData,也支持储存任何实现 <NSCoding> 协议的类。
  • EGOCache 只有一个类,并且为单例类,只有 EGOCache.h 和 EGOCache.m 两个文件。
  • EGOCache 只提供了磁盘缓存,没有提供内存缓存,同时,也提供了清理缓存的方法。
  • EGOCache 可以设定缓存过期时间,默认是 1 天,过期的缓存在创建 EGOCache 对象时会被删除。

2.1 添加 EGOCache

  • Github 网址:https://github.com/enormego/EGOCache
  • EGOCache 使用 ARC
  • Objective-C
        // 添加第三方库文件
        EGOCache-2.1.3
    
        // 包含头文件
        #import "EGOCache.h"
  • Swift
        // 添加第三方库文件
        EGOCache-2.1.3
    
        // 创建名为 “项目名-Bridging-Header.h” 的桥接头文件,如:
        SwiftLocalCache-Bridging-Header.h
    
        // 在 TARGETS -> Build Setting -> Swift Compiler - Code generation -> Objective-C Bridging Header 中
        // 添加 “项目名/项目名-Bridging-Header.h” 路径,如:
        SwiftLocalCache/SwiftLocalCache-Bridging-Header.h
    
        // 在创建的桥接头文件中包含头文件
        #import "EGOCache.h"

2.2 EGOCache 缓存

  • Objective-C

        // 判断缓存数据是否存在
    
            BOOL hasLocalCache = [[EGOCache globalCache] hasCacheForKey:@"qqCache"];
    
        // 读取缓存数据
    
            NSData *localData = [[EGOCache globalCache] dataForKey:@"qqCache"];
    
        // 存储缓存数据
    
            [[EGOCache globalCache] setData:data forKey:@"qqCache"];
  • Swift
        // 判断缓存数据是否存在
    
            let hasLocalCache = EGOCache.globalCache().hasCacheForKey("qqCache")
    
        // 读取缓存数据
    
            let localData = EGOCache.globalCache().dataForKey("qqCache")
    
        // 存储缓存数据
    
            EGOCache.globalCache().setData(data, forKey: "qqCache")

2.3 EGOCache 属性方法

  • 判断缓存数据是否存在方法

        // 判断指定缓存的数据是否存在
        - (BOOL)hasCacheForKey:(NSString* __nonnull)key;
  • 存储缓存数据方法
        // 存储 NSData 型数据
        - (void)setData:(NSData* __nonnull)data forKey:(NSString* __nonnull)key;
        - (void)setData:(NSData* __nonnull)data forKey:(NSString* __nonnull)key
                                   withTimeoutInterval:(NSTimeInterval)timeoutInterval;
    
        // 存储 NSString 型数据
        - (void)setString:(NSString* __nonnull)aString forKey:(NSString* __nonnull)key;
        - (void)setString:(NSString* __nonnull)aString forKey:(NSString* __nonnull)key
                                          withTimeoutInterval:(NSTimeInterval)timeoutInterval;
    
        // 存储 UIImage 型数据
        - (void)setImage:(UIImage* __nonnull)anImage forKey:(NSString* __nonnull)key;
        - (void)setImage:(UIImage* __nonnull)anImage forKey:(NSString* __nonnull)key
                                        withTimeoutInterval:(NSTimeInterval)timeoutInterval;
    
        // 存储 PList 型数据
        - (void)setPlist:(nonnull id)plistObject forKey:(NSString* __nonnull)key;
        - (void)setPlist:(nonnull id)plistObject forKey:(NSString* __nonnull)key
                                    withTimeoutInterval:(NSTimeInterval)timeoutInterval;
    
        // 存储 OBject 型数据
        - (void)setObject:(nonnull id<NSCoding>)anObject forKey:(NSString* __nonnull)key;
        - (void)setObject:(nonnull id<NSCoding>)anObject forKey:(NSString* __nonnull)key
                                            withTimeoutInterval:(NSTimeInterval)timeoutInterval;
  • 读取缓存数据方法
        // 读取 NSData 型缓存数据
        - (NSData* __nullable)dataForKey:(NSString* __nonnull)key;
    
        // 读取 NSString 型缓存数据
        - (NSString* __nullable)stringForKey:(NSString* __nonnull)key;
    
        // 读取 UIImage 型缓存数据
        - (UIImage* __nullable)imageForKey:(NSString* __nonnull)key;
    
        // 读取 PList 型缓存数据
        - (NSData* __nullable)plistForKey:(NSString* __nonnull)key;
    
        // 读取 OBject 型缓存数据
        - (nullable id<NSCoding>)objectForKey:(NSString* __nonnull)key;
  • 复制缓存数据方法
        // 复制指定缓存数据
        - (void)copyFilePath:(NSString* __nonnull)filePath asKey:(NSString* __nonnull)key;
    
        - (void)copyFilePath:(NSString* __nonnull)filePath asKey:(NSString* __nonnull)key
                                             withTimeoutInterval:(NSTimeInterval)timeoutInterval;
  • 清除缓存数据方法
        // 清除全部缓存数据
        - (void)clearCache;
    
        // 清除指定缓存的数据
        - (void)removeCacheForKey:(NSString* __nonnull)key;
  • 读取缓存信息方法
        // 获取指定缓存的缓存时间
        - (NSDate* __nullable)dateForKey:(NSString* __nonnull)key;
    
        // 获取所有缓存的 key 值
        - (NSArray* __nonnull)allKeys;
  • 创建缓存对象方法
        // 这种方法创建的缓存对象不是单例类,可以自己设置缓存路径
        - (nonnull instancetype)initWithCacheDirectory:(NSString* __nonnull)cacheDirectory;
  • 缓存时间属性
        // Default is 1 day
        @property(nonatomic) NSTimeInterval defaultTimeoutInterval;
时间: 2024-09-21 22:53:35

iOS - LocalCache 本地数据缓存的相关文章

Android清除本地数据缓存代码

/** * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录 */ import java.io.File; import android.content.Context; import android.os.Environment; /** * 本应用数据清除管理器 */ public class DataCleanManager { /** * 清除本应用内部缓存

android开发教程之清除android数据缓存示例(清除本地数据缓存)_Android

复制代码 代码如下: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录  */ import java.io.File;import android.content.Context;import android.os.Environment; /** * 本应用数据清除管理器 */public class DataCleanManager { 

ios做数据缓存后,显示数据的逻辑是怎样的?

问题描述 ios做数据缓存后,显示数据的逻辑是怎样的? ios做数据缓存后,显示数据的逻辑是怎样的?因为有上拉加载更多,和下拉刷新,求思路 解决方案 iOS数据缓存iOS开发数据缓存玩转iOS开发 - 数据缓存 解决方案二: 1.获取服务器数据后,可以写入本地文件中,需要用到的时候再去读取就可以了: 2.分页的话类似的: 解决方案三: 每次加载页面都可以先从缓存里面读取,读不到再网络获取

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

 在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制.使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求.下面将介绍如何在IOS设备中进行缓存.  内存缓存我们可以使用sdk中的NSURLCache类.NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型.    1.NS

iOS网络编程之六——数据缓存类NSURLCache使用解析

iOS网络编程之六--数据缓存类NSURLCache使用解析 一.引言         在前面博客中,介绍了NSURLRequest请求类的相关使用方法,其中有介绍关于请求返回数据的缓存策略,实际上,iOS中具体缓存操作的管理是由NSURLCache类来实现的.NSURLRequest类介绍的博客地址如下: iOS中NSURLRequest相关使用:http://my.oschina.net/u/2340880/blog/620225. 二.NSURLCache中方法与属性 ? 1 2 3 4

iOS开发网络篇—数据缓存

iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

iOS本地数据存取,这里就够了

iOS本地数据存取,看这里就够了 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 应用沙盒的文件系统目录 应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录 tmp:保存应

iOS开发中UIWebView的加载本地数据的三种方式_IOS

UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): UIWebView加载内容的三种方式: 1 加载本地数据文件 指定文件的MIMEType 编码格式使用@"UTF-8" 2加载html字符串(可以加载全部或者部分html

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以