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;
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM