ios缓存系列---1.0


     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 }    

待续...

时间: 2024-11-08 18:14:47

ios缓存系列---1.0的相关文章

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

iOS开发系列--让你的应用“动”起来

--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CALayer常用属性 CALayer绘图 C

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列—Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession

IOS开发系列 --- 核心动画

原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简

iOS开发系列--App扩展开发

概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更新也都是围绕扩展这一主题来进行了的,例如开发的Siri.iMessage Apps其实都是依靠扩展来工作的.在最新的Xcode 8 beta中也增加了众多的Extension 模板帮助开发者更快的实现不同类型的扩展.因此今天有必要介绍一下扩展相关的开发内容. 扩展的生命周期 iOS对于扩展的支持已经

iOS开发系列--网络开发网络联网程序

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS开发系列-动画绘图CALayer

代码下载地址:https://github.com/wwpeter/WW-MotionDemo.git 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单:

iOS开发系列--通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 推送通