gpt4 book ai didi

ios - 使用 NSCoding 缓存数据?

转载 作者:行者123 更新时间:2023-11-29 02:46:32 24 4
gpt4 key购买 nike

在我的应用程序中,我从服务器检索 URL 数据。作为一种优化,我通过将数据存储到自定义类中来标准化数据,以便以后可以快速访问数据。但是,我需要在本地和离线状态下存储此类的实例,以便可以避免从服务器检索数据(如果我已经这样做了)。此外,网站每天都会发生变化,因此缓存的数据仅在同一天才有用。

此场景适用于 2 个单独的类(总共 4 个对象),并且我尝试使用 NSCoding 保存此数据,如下所示。 (到目前为止,我只尝试实现 1 个对象,但我计划为每个对象创建一个单独的 docPath)

- (void) saveStateToDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];

if ([fileMan fileExistsAtPath:docPath])
[fileMan removeItemAtPath:docPath error:&error];

// Store the hours data
Hours *h = [self parseHoursFromServer];
NSDictionary *state = [NSDictionary dictionaryWithObjectsAndKeys:h, @"Hours", nil];

// There are many ways to write the state to a file. This is the simplest
// but lacks error checking and recovery options.
[NSKeyedArchiver archiveRootObject:state toFile:docPath];
NSLog(@"end");
}

- (NSDictionary*) stateFromDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];

if ([fileMan fileExistsAtPath:docPath])
return [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

return nil;
}

但是,当我尝试运行此代码时,我收到了 [HoursencodeWithCoder:]: unrecognized Selector sent to instance 0 因为我的类当前不支持 NSCoding。在reading about之后我需要如何为我的自定义类手动编码所有属性,我想确保 NSCoding 是我的数据缓存问题的理想解决方案。

编辑:

这是我目前创建 url 的方式

NSURL *url = [NSURL URLWithString:urlString];
NSData *pageData = [NSData dataWithContentsOfURL:url];

最佳答案

TL;DL;系统已经为您缓存!

当发出请求时,URL 加载系统将检查共享 URL 缓存以查看缓存中是否存在有效的匹配响应。如果有,它将使用它而不是建立网络连接。这对您的网络代码是透明的,无论是从缓存还是网络中获取数据,它的工作方式都是一样的。除了告诉 NSURLCache 使用磁盘之外,您无需执行任何其他操作:

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:(4 * 1024 * 1024) diskCapacity:(20 * 1024 * 1024) diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

这将允许它使用 4MB RAM、20MB 磁盘空间和磁盘上的默认缓存位置。这应该在您的应用程序启动时完成一次。从那时起,NSURLCache 会将任何可缓存的网络响应写入内存和磁盘。当它们过期或缓存空间不足时,它们将被删除。网络连接如何使用缓存由 NSURLRequestcachePolicy 决定。 NSURLRequestUseProtocolCachePolicy 的默认值根据协议(protocol) (HTTP) 的规则使用缓存。 HTTP 响应包含有关应将响应视为有效多长时间的信息,并且此策略遵守这些规则。在大多数情况下,这很有效——除非你正在与之通信的服务器错误地实现了 HTTP 响应缓存信息。如果您想更改缓存策略以不允许 URL 加载系统尝试从网络加载任何内容,请仅在设备的 radio 处于离线状态时执行此操作。如果设备处于飞行模式,您将使用不同的缓存策略构建您的 NSURLRequest(假设您使用 Reachability 来确定网络状态):

if (networkStatus == NotReachable){
request = [[NSURLRequest alloc] initWithURL:someURL cachePolicy: NSURLRequestReturnCacheDataDontLoad timeoutInterval:timeout];
} else {
request = [[NSURLRequest alloc] initWithURL:someURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeout];
}

如果设备处于飞行模式或者手机或 wifi 都没有信号,这将使用策略 NSURLRequestReturnCacheDataDontLoadNSURLRequestReturnCacheDataDontLoad 将从缓存中加载响应(即使已过期),并且不会尝试访问不在缓存中的项目的网络。

您可以在 URL Loading System Programming Guide: Understanding Cache Access 中阅读更多相关信息

关于ios - 使用 NSCoding 缓存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25050468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com