iOS应用程序:我应该何时清除缓存数据?(使用领域)

iOS应用程序:我应该何时清除缓存数据?(使用领域),ios,caching,model,realm,Ios,Caching,Model,Realm,在我的iOS应用程序中,我将特定数据(包含缓存模型的领域数据库)保存在设备的缓存目录中的磁盘上。 当用户使用应用程序时,缓存数据会增加,因此我希望定期清除旧的缓存数据 问题是我不知道如何检查我正在删除的模型是否被当前视图使用。 (通过尝试删除所有模型,我得到一个错误,告诉我当前视图使用的一些模型对象无效。) 为了确保我正在删除的缓存模型当前未被使用,我正在应用程序终止时清理缓存: - (void)applicationWillTerminate:(UIApplication *)applicat

在我的iOS应用程序中,我将特定数据(包含缓存模型的领域数据库)保存在设备的缓存目录中的磁盘上。 当用户使用应用程序时,缓存数据会增加,因此我希望定期清除旧的缓存数据

问题是我不知道如何检查我正在删除的模型是否被当前视图使用。 (通过尝试删除所有模型,我得到一个错误,告诉我当前视图使用的一些模型对象无效。)

为了确保我正在删除的缓存模型当前未被使用,我正在应用程序终止时清理缓存:

- (void)applicationWillTerminate:(UIApplication *)application {
    [[ModelManager sharedInstance] deleteUnusedCacheModels];
}
deleteUnusedCacheModels中的示例代码:

        NSDate* limitDate = [NSDate dateWithTimeIntervalSinceNow:-(60.0 * 60.0 * 24.0 * 7.0)];
        RLMResults* modelProductListArray = [ModelProductList objectsInRealm:_cacheDb
                                                                       where:@"modelUpdate < %@ || modelDelete = %@", limitDate, @YES];
        [_cacheDb deleteObjects:modelProductListArray];
NSDate*limitDate=[NSDate-datewithtimeintervalsince:-(60.0*60.0*24.0*7.0)];
RLMResults*modelProductListArray=[ModelProductList objectsInRealm:\u cacheDb
其中:@“modelUpdate<%@| modelDelete=%@”,limitDate,@YES];
[\u cacheDb deleteObjects:modelProductListArray];
但如果用户不经常终止应用程序,则不会执行此代码。 (大多数用户将应用程序留在后台。)

有没有更好的方法来清理缓存的模型数据


谢谢。

我最终得到了以下解决方案

模型中的实现:

  • 设置属性NSDate*modelUpdate,该属性指示模型的上次更新。适用于旧模型时应删除的模型
  • 在每个需要删除的模型中设置属性BOOL modelDelete。 但不要在应用程序运行时删除任何内容。(因此内存中的现有模型不会失效)
在服务器请求上回收缓存模型的策略:

  • 检查给定服务器请求是否存在缓存模型列表(比如缓存a)。(其中modelDelete=NO)
  • 同时,即使缓存存在,也要在后台运行对服务器的请求
  • 使用缓存将内容尽快显示给用户。(不要让用户等待)
  • 完成对服务器的请求后,将新结果保存到缓存中。(缓存B)
  • 使用新数据更新用户看到的内容,轻轻地使用淡入淡出等
  • 标记要删除的缓存A的所有型号。(modelDelete=YES)
  • 在以下时间删除缓存:

    • 当应用程序启动时。(didFinishLaunchingWithOptions)
    • 当应用程序终止时。(应用程序将终止)
    代码如下:

    NSDate* limitDate = [NSDate dateWithTimeIntervalSinceNow:-(60.0 * 60.0 * 24.0 * 7.0)];
    RLMResults* modelProductListArray = [ModelProductList objectsInRealm:_cacheDb
                                                                   where:@"modelUpdate < %@ || modelDelete = YES", limitDate];
    [_cacheDb deleteObjects:modelProductListArray];
    
    NSDate*limitDate=[NSDate-datewithtimeintervalsince:-(60.0*60.0*24.0*7.0)];
    RLMResults*modelProductListArray=[ModelProductList objectsInRealm:\u cacheDb
    其中:@“modelUpdate<%@| modelDelete=YES”,limitDate];
    [\u cacheDb deleteObjects:modelProductListArray];
    
    可能在应用程序启动时清除缓存?你是说使用选项完成启动吗?是的,也许它比应用程序终止要好。但我认为后台应用程序不需要它。基本上,只有当你保证数据库中没有对对象的强引用时,你才会想要清理缓存。遵守该标准的最简单方法是在任何东西从数据库获得对对象的引用之前清除缓存。没错。谢谢:)