iOS - LocalCache 本地数据缓存

简介: 1、自定义方式本地数据缓存1.1 自定义缓存 1沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视频文件等。

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;
目录
相关文章
|
3月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
47 0
|
4月前
|
存储 缓存 分布式计算
亿级数据如何分钟级别写入缓存?
亿级数据如何分钟级别写入缓存?
30 0
|
4天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
4天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis缓存数据实战
Redis入门到通关之Redis缓存数据实战
|
17天前
|
存储 缓存 iOS开发
基于iOS的高效图片缓存策略实现
【4月更文挑战第9天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。特别是对于iOS平台,合理设计图片缓存策略不仅能够提升用户浏览图片时的流畅度,还能有效降低应用程序的内存压力。本文将介绍一种针对iOS环境优化的图片缓存技术,该技术通过多级缓存机制和内存管理策略,实现了图片快速加载与低内存消耗的目标。我们将从系统架构、关键技术细节以及性能评估等方面展开讨论,为开发者提供一套实用的图片缓存解决方案。
17 0
|
23天前
|
存储 缓存 iOS开发
实现iOS平台的高效图片缓存策略
【4月更文挑战第4天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的关键因素之一。尤其对于iOS平台,由于设备存储和内存资源的限制,设计一个高效的图片缓存机制尤为重要。本文将深入探讨在iOS环境下,如何通过技术手段实现图片的高效加载与缓存,包括内存缓存、磁盘缓存以及网络层面的优化,旨在为用户提供流畅且稳定的图片浏览体验。
|
1月前
|
缓存 NoSQL Java
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
44 0
|
2月前
|
存储 缓存 算法
使用Java实现高效的数据缓存系统
【2月更文挑战第3天】在大规模的应用程序中,数据缓存是提高应用程序性能的一种重要方法。本文介绍了如何使用Java实现高效的数据缓存系统。我们将讨论缓存的设计原则和缓存算法的选择,同时详细说明如何使用Java内置的缓存库和其他开源工具来构建一个可靠、高效的数据缓存系统。
|
6月前
|
消息中间件 缓存 Java
Java 最常见的面试题:怎么保证缓存和数据库数据的一致性?
Java 最常见的面试题:怎么保证缓存和数据库数据的一致性?

热门文章

最新文章