iOS应用:我什么时候应该清除缓存数据? (使用Realm)

时间:2015-02-19 12:54:05

标签: ios caching model realm

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

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

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

- (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];

但是,如果用户不经常终止应用程序,则不会执行此代码。 (大多数用户将应用程序保留在后台。)

是否有更好的方法来清理缓存的模型数据?

感谢。

1 个答案:

答案 0 :(得分:1)

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

模型中的实现:

  • 设置属性NSDate * modelUpdate,指示模型的上次更新。适用于旧时应删除的型号。
  • 在每个需要删除的模型中设置属性BOOL modelDelete。 但是在应用程序运行时不要删除任何内容。 (因此内存上的现有模型不会失效)

在服务器请求上回收缓存模型的策略:

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

    • 应用启动时(didFinishLaunchingWithOptions)
    • 当应用终止时。 (applicationWillTerminate)

    使用这样的代码:

    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];