iOS-周边收集iOS开发实用技巧iOS记录

iOS 本地缓存总结

2017-03-21  本文已影响4525人  devRen
sandBox.png

沙盒中的目录

AppName.app

Documents/

Documents/Inbox

Library/

Library/Caches

Library/Preferences

tmp

常见数据缓存

Foundation对象

保存在沙盒Documents或Library/Preferences目录下,可以通过plist、NSUserDefaults、NSKeyedArchiver技术来保存。

常见数据类型

保存在沙盒Documents或Library/Preferences目录下,可以通过NSUserDefaults技术来保存。

自定义的对象

保存在沙盒Documents目录下,可以通过NSKeyedArchiver技术来保存。

图片资源

    //获取沙盒路径,  
     NSString *path_sandox = NSHomeDirectory();  
    //创建一个存储plist文件的路径  
    NSString *newPath = [path_sandox stringByAppendingPathComponent:@/Documents/pic.plist];  
    NSMutableArray *arr = [[NSMutableArray alloc] init];  
    UIImage *image = [UIImage imageNamed:@"1.png"]; 
 
    NSData *_data = UIImageJPEGRepresentation(image, 1.0f);  
    //将图片的data转化为字符串  
    NSString *strimage64 = [_data base64EncodedString];  
  
    [arr addObject:image64];      
    //写入plist文件      
    [arr writeToFile:newPath atomically:YES];
    
    NSData *_decodedImageData = [[NSData alloc]initWithBase64EncodedString:strimage64 options:NSDataBase64DecodingIgnoreUnknownCharacters];  
    UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData]; 
    //拿到图片  
    UIImage *image2 = [UIImage imageNamed:@"1.png"];   
    NSString *path_document = NSHomeDirectory();  
    //设置一个图片的存储路径  
    NSString *imagePath = [path_document stringByAppendingString:@"/Documents/pic.png"];  
    //把图片直接保存到指定的路径(同时应该把图片的路径imagePath存起来,下次就可以直接用来取)  
    [UIImagePNGRepresentation(image2) writeToFile:imagePath atomically:YES];  

获取各目录路径的方法

    NSHomeDirectory() 
    [[NSBundle mainBundle] bundlePath] 
    NSTemporaryDirectory() 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *docPath = [paths objectAtIndex:0];

缓存数据的方式

plist文件

直接写文件方式plist:可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber。也可以通过代码的方式进行读写,方法如下:

    NSDictionary *addDic = @{@"name" : @"dev",
                              @"age" : @"24"};
    //将字典保存到document文件->获取appdocument路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    //要创建的plist文件名 -> 路径
    NSString *filePath = [docPath stringByAppendingPathComponent:@"cityPlist.plist"];
    //将字典写入文件
    [addDic writeToFile:filePath atomically:YES];
    //读取文件
    NSMutableDictionary *plistDic = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

NSUserDefaults

    // 存
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:@"jack" forKey:@"firstName"];
    [defaults setInteger:10 forKey:@"Age"];
    
    UIImage *image =[UIImage imageNamed:@"somename"];
    NSData *imageData = UIImageJPEGRepresentation(image, 100);//把image归档为NSData
    [defaults setObject:imageData forKey:@"image"];
    
    [defaults synchronize];
    
    // 读
    NSString *firstName = [defaults objectForKey:@"firstName"];
    NSInteger age = [defaults integerForKey:@"Age"];
    
    NSData *imageData = [defaults dataForKey:@"image"];
    UIImage *image = [UIImage imageWithData:imageData];
    setBool:forKey:
    setFloat:forKey:
    setInteger:forKey:
    setDouble:forKey:
    setURL:forKey:

NSKeyedArchiver

把对象转为字节码加密,以文件的形式存储到磁盘上,程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。归档的对象包括:Foundation框架中对象、自定义的对象、自定义的内容。

    // 获得文件路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
    
    // 归档(序列化)
    NSArray *archiveAry = @[@"dev",@"iOS"];
    [NSKeyedArchiver archiveRootObject: archiveAry toFile:filePath];

    //解归档(反序列化)
    NSArray *unArchiveAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    // 获得文件路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
    
    // 1. 使用NSMutableData存放归档数据
    NSMutableData *archiverData = [NSMutableData data];
    // 2. 创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
    // 3. 添加归档内容 (设置键值对)
    [archiver encodeObject:@"dev" forKey:@"name"];
    [archiver encodeInt:24 forKey:@"age"];
    [archiver encodeObject:@[@"iOS",@"OC"] forKey:@"language"];
    // 4. 完成归档
    [archiver finishEncoding];
    // 5. 将归档的信息存储到磁盘上
    [archiverData writeToFile:filePath atomically:YES];
    
    
    // 解归档
    // 1. 从磁盘读取文件,生成NSData实例
    NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
    // 2. 根据Data实例创建和初始化解归档对象
    NSKeyedUnarchiver *unachiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
    // 3. 解归档,根据key值访问
    NSString *name = [unachiver decodeObjectForKey:@"name"];
    int age = [unachiver decodeIntForKey:@"age"];
    NSArray *ary = [unachiver decodeObjectForKey:@"language"];
    // RYJPerson.h
    @interface RYJPerson : NSObject<NSCoding>
    @property (nonatomic,copy) NSString* name;
    @property (nonatomic,assign) NSInteger age;
    @property (nonatomic,assign) NSInteger number;
    @end
    
    // RYJPerson.m
    @implementation RYJPerson

    - (instancetype)initWithCoder:(NSCoder *)aDecoder {
        if (self = [super init]) {
         self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];
            self.number = [aDecoder decodeIntegerForKey:@"number"];
        }
    
        return self;
    }

    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
        [aCoder encodeInteger:self.number forKey:@"number"];
    }

    @end

    RYJPerson *Person = [[RYJPerson alloc] init];
    Person.name = @"dev";
    Person.age = 24;
    Person.number = 110;
    
    // 创建路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];
    NSString *accountPath = [documentPath stringByAppendingPathComponent:@"Account.data"];
    
    // 存
    [NSKeyedArchiver archiveRootObject:Person toFile:accountPath];
    
    // 读
    RYJPerson *account = [NSKeyedUnarchiver unarchiveObjectWithFile:accountPath];

SQLite3

使用SQLite3存储和读取数据

Core Data

认识CoreData—初识CoreData

认识coredata—基础使用

认识CoreData—使用进阶

认识CoreData—高级用法

认识CoreData—多线程

认识CoreData-MagicalRecord

关于APP更新后沙盒缓存的问题

关于Xcode run操作后的沙盒缓存问题

关于此问题做了以下实验:
(实验前在Documents、Library\Caches、Library\Preferences、tmp目录下各存了一个plist文件,并删除了存入文件的代码)

相关链接

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

iOS开发——你真的会用SDWebImage?

iOS音频篇:AVPlayer的缓存实现

iOS音视频实现边下载边播放

Realm数据库 从入门到“放弃”

上一篇 下一篇

猜你喜欢

热点阅读