我在我的应用内缓存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()提供)
如何在存储之前确定两个对象是否正确连接(最新数据与当前时间)?
答案 0 :(得分:0)
假设您正在调用web api,大多数web apis都会返回缓存标头。基于缓存头值缓存数据是安全的,这样就不会有任何过时的缓存。
答案 1 :(得分:0)
我遇到的适合我的解决方案是在扩展内部的主队列NSManagedObjectContext上设置stalenessInterval:
objectContext.stalenessInterval = 0.0;
这告诉扩展中的上下文每次都获取新数据并忽略缓存。