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

iOS app: When should I clear my cache data? (using Realm)

在我的 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* modelUpdate 指示模型的最后更新。对于老了就该删的模型
  • 在每个需要删除的模型中设置一个属性 BOOL modelDelete。 但不要在应用 运行 正在运行时删除任何内容。 (因此内存中的现有模型不会失效)

根据服务器请求回收缓存模型的策略:

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

在以下时间删除缓存:

  • 应用程序启动时。 (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];