ios开发数据缓存,ios开发cache缓存机制

ios中关于方法缓存cache策略

文章部分出于自己的理解,有不对的地方,希望大家指正。

在光山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站制作 网站设计制作按需定制开发,公司网站建设,企业网站建设,高端网站设计,成都全网营销,成都外贸网站制作,光山网站建设费用合理。

实例对象我们可以看作是一个指针,实例对象通过isa指针指向类对象,类对象通过isa指针指向元类对象,类对象和元类对象本身其实都是objc_class结构体,里面存放着我们需要的方法列表等。

那么当我们方法调用的时候,方法是如何缓存的呢?

当我们方法调用的时候,首先通过isa指针找到类对象,然后在类对象的方法列表里面查找相对应的方法,找到以后会加入到我们方法缓存里面,等下次我们再调用的时候,首先会先从缓存里面去查找相关方法,更加的效率。

那如果我们调用的是父类里面的方法呢,其实父类对象里面的方法是不可以缓存到子类方法缓存列表里面的,所以,当我们调用的是父类对象里面的方法的时候,其方法不会在子类对象方法缓存列表里面进行缓存。

元类对象的相关缓存同类对象。

至于缓存扩容和具体的缓存策略:

在arm64结构,也就是真机环境下,刚开始初始化的缓存方法的容器的长度2,当容器的长度小于8时,是满容量了才扩容。当容器的长度大于8时,是7/8扩容。也就是说当容器的长度为8时,容器可以存储8个方法。当容器的长度为16时,当第15个方法需要存储进来的时候,容器就要扩容了。

在x86_64架构下,刚开始初始化的容器的长度为4,是3/4扩容。这里的3/4扩容指的是:如果容器的长度为4,当第3个数据需要存储的时候,就要扩容了。如果容器的长度为8,当第6个数据需要存储的时候,就要扩容了。也就是说容器只能存储容器长度的3/4减1个方法。

还有一点就是:当容器扩容之后,前面存储的方法也会随之清空。

参考链接:

iOS开发之数据存储以及删除

iOS本地数据保存有多种方式,归纳如下:

本章不仅是学习多种数据存储方式,也可学习到其他知识点,下面就让我们详细来看:

具体方法为:

第一步:获得文件即将保存的路径,并生成在该路径下的文件:

第二步:往文件中写入/读取:

方法一:

方法二:

方法三:

2.NSUserDefaults:是一个单例对象,在整个应用程序的生命周期中都只有一个实例。用来保存应用程序设置和属性、用户保存的数据。存储在沙盒的Library/Preference中,NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。写入和读取都比较简单,如下:

写入:

NSString *str = [userDefault objectForKey:@"zhigang"];

@interface Person : NSObject NSCoding//遵守NSCoding协议

@property (nonatomic,strong) NSString *name;

@property (nonatomic,assign) NSInteger age;

@end

解档操作:

同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可

[NSKeyedUnarchiver unarchiveObjectWithFile:path];

NSMutableData *data = [NSMutableData data];

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

[archiver encodeObject:person forKey:@"person"];

[archiver encodeObject:bir forKey:@"bir"];

// 存档完毕(一定要调用这个方法)

[archiver finishEncoding];

[data writeToFile:path atomically:YES];

NSData *undata = [NSData dataWithContentsOfFile:path];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

[unarchiver decodeObjectForKey:@"person"];

[unarchiver decodeObjectForKey:@"bir"];

// 恢复完毕

[unarchiver finishDecoding];

ios开发数据缓存如何获取服务端最新数据

方法一:一般将服务器第一次返回的数据保存在沙盒里面。这样在手机断网的情况下可以从本地读取数据了。

1.保存到沙盒的代码:

[plain] view

plaincopy

+ (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;

{

NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];

NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];

[setting setObject:str forKey:key];

[setting synchronize];

}

2.读取本地沙盒的代码

读取之前首先根据type和Id判断本地是否有

[plain] view

plaincopy

+ (NSString *)getCache:(int)type andID:(int)_id

{

NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];

NSString *value = [settings objectForKey:key];

return value;

}

如果沙盒里面有数据

[plain] view

plaincopy

NSString *value = [Tool getCache:5 andID:self.QiuTime];

if (value) {

NSDictionary *backdict = [value JSONValue];

if ([backdict objectForKey:@"items"]) {

NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];

for (NSDictionary *qiushi in array) {

QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];

[self.list addObject:qs];

}

}

[self.tableView reloadData];

}

[self.tableView tableViewDidFinishedLoadingWithMessage:@"数据全部加载完了.."];

self.tableView.reachedTheEnd = YES;

方法二:使用ASIHTTPRequest和ASIDownloadCache实现本地缓存

1、设置全局的Cache

在AppDelegate.h中添加一个全局变量

[plain] view plaincopy

@interface AppDelegate : UIResponder

{

ASIDownloadCache *myCache;

}

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic,retain) ASIDownloadCache *myCache;

在AppDelegate.m中的- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代码

[plain] view plaincopy

//自定义缓存

ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];

self.myCache = cache;

[cache release];

//设置缓存路径

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentDirectory = [paths objectAtIndex:0];

[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];

[self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];

在AppDelegate.m中的dealloc方法中添加如下语句

[plain] view plaincopy

[myCache release];

到这里为止,就完成了全局变量的声明。

2、设置缓存策略

在实现ASIHTTPRequest请求的地方设置request的存储方式,代码如下

[plain] view plaincopy

NSString *str = @"";

NSURL *url = [NSURL URLWithString:str];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

//获取全局变量

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

//设置缓存方式

[request setDownloadCache:appDelegate.myCache];

//设置缓存数据存储策略,这里采取的是如果无更新或无法联网就读取缓存数据

[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

request.delegate = self;

[request startAsynchronous];

3、清理缓存数据

我在这里采用的是手动清理数据的方式,在适当的地方添加如下代码,我将清理缓存放在了应用的设置模块:

[plain] view plaincopy

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

[appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

这里清理的是ASICachePermanentlyCacheStoragePolicy这种存储策略的缓存数据,如果更换其他的参数的话,即可清理对应存储策略的缓存数据。

IOS中的缓存

NSCache是苹果系统提供的一个缓存框架,用法和NSMutableDictionary 相似。都是通过setValue: forKey: 设置值、和objectForKey 取值,

但还是有区别:

设置代理

需要类遵守协议NSCacheDelegate

把数据写入NSCache缓存

读取内存缓存NSCache

删除 NSCache数据

代理方法

即将回收清理cache的时候调用改方法

1.获取根目录

let homePath = NSHomeDirectory()

2.获取其他目录

获取沙盒目录路径可以通过 NSSearchPathForDirectoriesInDomains 方法,该方法有三个数:

iOS开发中为什么要使用缓存

如果实现接口数据没有变化使用缓存的功能?

拿到本地数据摘要传给后台,后台判断数据是否发生了变化,如果没有变化就不给返回这个接口的大量数据,如果发生了变化就返回这个接口的大量数据。


文章标题:ios开发数据缓存,ios开发cache缓存机制
网址分享:http://ybzwz.com/article/dsiigii.html