无限期坚持NSDictionary的最佳方式

时间:2014-01-20 16:12:42

标签: ios objective-c nsdictionary

我有一个应用程序依赖于一个中等大小(300kb)的数据拉动负载,数据每隔2-3个月定期更改一次。它的加载速度相当快,但我正在尝试为离线使用构建更强大的支持,而不必每次都无缘无故地重新加载它。数据是JSON,它直接序列化为易于使用的深层,多级NSDictionary结构。所以,如果可以的话,我很高兴保留NSDictionary格式。

使用方案/想法:

  • 当应用程序处于后台时,字典会自动保留,因此恢复它不必在viewWillAppear上重新加载(如果存在)。

  • 当应用程序终止时,更重要的是,每次都需要将数据重新加载到内存而不需要新的请求。它似乎太大而且不适合存储在UserDefaults中。然而,过于复杂而无法将CoreData或SQLLite用于持久性尝试。

  • 我考虑过平面文件存储,但我不确定plist转换是最好的格式,并且不熟悉将大量NSDictionary序列化/反序列化为常规文本的方法。

  • 最后,如果数据最终变得陈旧,最终需要知道刷新自己。我已经考虑过使用NSURLConnection各种缓存选项,但我不确定这种情况的适当选项。

寻找针对此方案的建议最佳方法。

编辑我使用的粗略解决方案,保存到文件:

在适当的加载/退出时在AppDelegate中调用,并将URL加载作为后备。

- (void) saveResultsToFile {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"schedule.plist"];
    BOOL writeSuccess = [_routeData writeToFile:path atomically:YES];
}

- (void) readResultsFromFile {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory =  [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"schedule.plist"];
    _routeData = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
}

3 个答案:

答案 0 :(得分:3)

对于占用大量内存(超过几MB)的大量数据,我建议使用CoreData。

它为您提供最佳内存使用 - 不会将所有对象加载到内存中,因此您不会有任何可能导致崩溃的危险内存选择。它还为您提供最佳的排序/过滤方法。

如果您正在使用该数据(如过滤,排序)并且可能会在将来增长 - 请不要将所有内容保存在内存中并使用适当的工具进行无限制的数据过滤/显示。当您使用NSFetchedResultController和XCode 5中的所有工具时,它非常容易使用,并且您可以免费获得许多最复杂的东西;)

如果您不想使用CoreData或者不使用太多内存,可以考虑使用NSCoding将文件保存到文档文件夹中,并将其保存在二进制文件中。

答案 1 :(得分:3)

我认为你走在正确的轨道上。

  1. [dataDictionary writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>]; dataDictionary = [NSDictionary dictionaryWithContentsOfFile:<#(NSString *)#>]持久性是一件好事,但如果您要立即处理该文件,您当然应该使用后台线程。
  2. 此外,使用缓存机制这是一个好主意,但请查看 SDURLCache https://github.com/steipete/SDURLCache),因为NSURLRequestReloadRevalidatingCacheData目前尚未实现。

答案 2 :(得分:-1)

您可以使用NSUserDefaults来保存少量数据。它不像其他频道那样安全,但非常适合存储NSDictionary个对象。易于保存,易于检索。