iOS存储文件在缓存目录中设置的时间长度

时间:2012-02-05 18:32:12

标签: objective-c ios ipad

我们有一个POS公寓租赁iPad应用程序,用于收集有关用户及其兴趣的大量数据(当然他们的知识)。

我们使用RestKit将CoreData与服务器同步,这非常甜蜜。

我正在使用缓存目录中的文本文件来存储他们与访客卡交互的历史记录,以便在出现错误时提交,或通过电子邮件发送给我们,以便重新创建任何访客卡以防万一某种同步问题。

虽然这些应该是非常小的文本文件,可能大约是1-3k,我觉得我最终应该从缓存目录中清除它们。 (当我输入它时,也许它太小了我不应该担心它。)

我很好奇是否有任何方法可以在一段时间后从缓存目录中清除文件?说90天左右?

1 个答案:

答案 0 :(得分:3)

街上的Word是,如果您使用受制裁的NSCachesDirectory位置,如果操作系统需要该空间,它将删除该目录中的内容。我从来没有真正看到它在实践中发生过,但我听说过这样的事情(并且它有理由,否则为什么要为缓存文件提供特殊的操作系统认可的位置。)

那就是说,这个任务听起来很简单。只需触发一个低优先级的GCD背景块来迭代该目录中的文件,并删除其创建日期为>的任何文件。 90天前如果您只关心数据创建的时间(这与上次访问数据相反,而不是自己跟踪更难以确定的数据),这非常简单。)NSFileManager是您的朋友。这样的事情应该有效:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    NSFileManager* fm = [NSFileManager defaultManager];
    NSMutableArray* urlsToDelete = [NSMutableArray array];
    for (NSURL* dirUrl in [fm URLsForDirectory: NSCachesDirectory inDomains:NSUserDomainMask])
    {
        NSDirectoryEnumerator* dirEnum = [fm enumeratorAtURL: dirUrl 
                                  includingPropertiesForKeys: [NSArray arrayWithObject: NSFileModificationDate]  
                                                     options: 0 
                                                errorHandler: ^(NSURL* a, NSError* b){ return (BOOL)YES; }];
        NSURL* url = nil;
        while ((url = [dirEnum nextObject]))
        {
            NSDate* modDate = [[dirEnum fileAttributes] objectForKey: NSFileModificationDate];
            if (modDate && [[NSDate date] compare: [modDate dateByAddingTimeInterval: 60 * 60 * 24 * 90]] == NSOrderedDescending)
            {
                [urlsToDelete addObject: url];
            }
        }                
    }

    for (NSURL* url in urlsToDelete)
    {
        [fm removeItemAtURL: url error: NULL];
    }
});

澄清一下,如果你正在寻找一种机制来告诉操作系统'如果我超过90天没有访问它就删除它',并让它为你追踪,我不相信存在这样一种机制。