1. 程式中什麼時候用到緩存 2. 緩存機制 1)第一次請求數據時,記憶體緩存中沒有數據,硬碟緩存中沒有數據。 2)當伺服器返回數據時,需要做一下步驟 1>使用伺服器的數據 2>將伺服器的數據緩存到硬碟(沙盒) 此時,記憶體緩存中有數據,硬碟緩存中沒有數據 3)再次請求數據分為兩種情況: 1>如果程式並 ...
1. 程式中什麼時候用到緩存
2. 緩存機制
1)第一次請求數據時,記憶體緩存中沒有數據,硬碟緩存中沒有數據。
2)當伺服器返回數據時,需要做一下步驟
1>使用伺服器的數據
2>將伺服器的數據緩存到硬碟(沙盒)
此時,記憶體緩存中有數據,硬碟緩存中沒有數據
3)再次請求數據分為兩種情況:
1>如果程式並沒有關閉,一直在運行,
那麼此時記憶體緩存中有數據,硬碟緩存中有數據。如果此時再次請求數據,直接使用記憶體緩存中的數據即可。
2>如果程式重新啟動
那麼此時記憶體緩存的數據已經消失,硬碟緩存依舊存在,如果此時再請求數據,直接使用硬碟緩存的數據即可。
提示:從硬碟緩存中讀取數據後,記憶體緩存中又有數據了。
3.緩存的幾種常用方法及具體如何使用
1) 歸檔
2) 生成plist
3) NSUserDefault
4) sqlite
1.1>歸檔:可以存放自定義對象 <NSCoding>
常用方法: //存 [NSKeyedArchiver archiveRootObject:p toFile:path];
//取 [NSKeyedUnarchiver unarchiverObjectWithFile:path];
/*當將一個自定義對象保存到文件的時候就會調用該方法,在該方法中說明如何存儲自定義對象的屬性*/
-(void)encodeWithCoder:(NSCoder *)aCoder
/*當文件中讀取一個對象的時候回調用該方法,在該方法中說明如何讀取保存在文件中的對象*/
-(id)initWithCoder:(NSCoder *)aDecoder
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject<NSCoding> 4 5 @property (nonatomic, copy) NSString *name; 6 @property (nonatomic, assign) NSInteger age; 7 @property (nonatomic, assign) BOOL sex; 8 9 @end
#import "Person.h" @implementation Person //歸檔 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; [aCoder encodeBool:self.sex forKey:@"sex"]; } //解檔 - (instancetype)initWithCoder:(NSCoder *)aDecoder { if (self == [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; self.sex = [aDecoder decodeBoolForKey:@"sex"]; } return self; } @end
#import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, strong) Person *person; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self saveCacheData]; } - (Person *)person { if (_person == nil) { _person = [[Person alloc] init]; _person.name = @"xinjinying"; _person.age = 11; _person.sex = YES; } return _person; } #pragma mark - 歸檔存儲緩存數據 - (void)saveCacheData { NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *cachePath = [path stringByAppendingPathComponent:@"tooyoung.toosimple"]; NSLog(@"%@",cachePath); [NSKeyedArchiver archiveRootObject:self.person toFile:cachePath]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *readDataPath = [path stringByAppendingPathComponent:@"tooyoung.toosimple"]; NSLog(@"%@",readDataPath); Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:readDataPath]; NSLog(@"%@-%zd-%d",person.name,person.age,person.sex); }
2.1>生成plist文件
#pragma mark - 寫入讀取plist文件 - (void)writeAndReadPlistFile { //讀取plist NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistdemo" ofType:@"plist"]; NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; //添加一項內容 [data setObject:@"yoyoyo" forKey:@"key"]; //存入yoyoyo.plist NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *writePath = [path stringByAppendingPathComponent:@"yoyoyo.plist"]; [data writeToFile:writePath atomically:YES]; }
3.1>NSUserDefault(項目里一般用來存用戶名,密碼,accessToken,版本號...)
1 #pragma mark - NSUserdefaults 2 - (void)userDefaultCache 3 { 4 //存 5 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 6 [userDefaults setObject:@"fuck" forKey:@"name"]; 7 [userDefaults synchronize]; 8 } 9 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 10 { 11 //取 12 NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults]; 13 NSString *name = [userDetaults objectForKey:@"name"]; 14 NSLog(@"%@",name); 15 }
待續...