如何在新数据可用时阻止使用缓存?

时间:2016-01-27 07:12:51

标签: ios swift caching core-data

我在我的应用内缓存CoreData中的数据,以便在没有新内容时减少更新请求。

这是我在伪代码中的缓存逻辑:

if cacheExistsInCoreData {
  if cacheIsOutdated  {
    loadDataFromRemoteAndCacheItWithCurrentDate()  
  }else {
    useCache()
}else {
  loadDataFromRemoteAndCacheItWithCurrentDate()
}

我如何检查缓存是否过时:

func checkIfCacheIsOutdated {
  if lastCachedDate isOrderThan selfDefinedCheckingDate {
   return true // need to load new data
  }else {
   return false // just use cache
  }
}

这种机制几乎一直都很好。

在极少数情况下,我发现我的程序使用正确的日期缓存了错误的数据,这意味着用户可能会看到较旧的数据,并且在新的数据可用时无法获得更新。

如果我的缓存逻辑没有任何问题,我想知道原因可能是我的应用程序在更新之前获取远程数据,然后将其存储在具有最新日期时间的核心数据中。

核心数据中的缓存包括:

  

数据(由远程服务器提供)//我无能为力......

     

日期(由我使用NSDate()提供)

如何在存储之前确定两个对象是否正确连接(最新数据与当前时间)?

2 个答案:

答案 0 :(得分:0)

假设您正在调用web api,大多数web apis都会返回缓存标头。基于缓存头值缓存数据是安全的,这样就不会有任何过时的缓存。

答案 1 :(得分:0)

我遇到的适合我的解决方案是在扩展内部的主队列NSManagedObjectContext上设置stalenessInterval:

objectContext.stalenessInterval = 0.0;

这告诉扩展中的上下文每次都获取新数据并忽略缓存。