【问题标题】:How to persist a file under NSHomeDirectory()?如何在 NSHomeDirectory() 下持久化文件?
【发布时间】:2015-01-05 10:46:12
【问题描述】:

我正在使用NSKeyedArchiverNSKeyedUnarchiver 为我的应用实现缓存功能。

为了在每次应用启动时加载缓存文件,我将缓存文件存储在NSHomeDirectory() 下。代码(C函数)如下:

NSString* getArchivePathForId(NSString* modelId)
{
    NSString *cacheIdentifier = @"CacheIdentifier";
    NSString *archiveDirPath = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/%@/cachedModel/%@", getAppVersion(), cacheIdentifier];

    NSError* error;
    if (![[NSFileManager defaultManager] fileExistsAtPath:archiveDirPath]) {
        if (![[NSFileManager defaultManager] createDirectoryAtPath:archiveDirPath
                                   withIntermediateDirectories:YES
                                                    attributes:nil
                                                         error:&error])
        {
            NSLog(@"Create directory tmp/cachedModel directory error: %@", error);
            return nil;
        }
    }

    NSString *archivePath = [archiveDirPath stringByAppendingFormat:@"/%@", modelId];
    return archivePath;
}

只要应用程序正在运行或从后台模式恢复运行,它就可以正常工作。但是一旦应用程序终止并重新运行,缓存的存档文件就会被删除。

有什么办法可以保存存档文件,以便我可以加载上次启动应用程序时存储的缓存。

我已经意识到,每次启动应用程序时,NSHomeDirectory() 的应用程序 id 部分都是不同的。这跟我的问题有关系吗?

【问题讨论】:

标签: ios caching nskeyedarchiver nskeyedunarchiver


【解决方案1】:

问题在于顶层的“tmp”目录名称。一般文件保存在“Documents”目录下:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];`

持久化缓存一般直接放在“Library”下面,使用NSLibraryDirectory

见:File System Programming Guide

tmp/ 使用此目录来编写不需要在应用程序启动之间保留的临时文件。当不再需要文件时,您的应用应从该目录中删除文件;但是,当您的应用未运行时,系统可能会清除此目录。

【讨论】:

  • 感谢您的回复。所以我应该使用NSLibraryDirectory 而不是NSHomeDirectory,对吗?那么链接中提到的Library/Caches/目录呢,我应该把我的缓存文件放在这个目录下还是只是Library/目录下?
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 2015-07-26
  • 1970-01-01
  • 2011-02-04
  • 2019-01-29
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多