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;