在我的应用程序中,我从api发出了一个http请求,我收到了一个包含大量信息的JSON,并且在该信息中,我从我在应用程序中下载图像的地方获取了URL,所有这些都存储在“UserInfo”类的数组中。现在我想像这样缓存存储在我的数组中的数据。因为在我不知道如何处理之前我从未做过那些东西,我搜索了不同的主题和链接,但没有一个与我想要实现的内容相关也许这里有人可以指出我正确的方向:
提出要求时:
检查RAM中的数组,如果有,请抓住它,否则
检查硬盘中的阵列数据,如果有,请抓住它,否则
发出http请求并下载所有内容。
另外,对于硬盘30,我希望RAM的有效期为10分钟。
我确实读过有关NSCache和NSURLCache但我不知道如何获得我上面写的内容。
编辑:
我解决了保存在磁盘上的问题,现在我遇到了NSCache的问题。当我要求我的数据时,它总是返回nil。我在swift 3中编码,NSCache是一个泛型类型,它接受ObjectTypes键和值,我认为我的值转换存在问题,在函数加载数据中它总是跳过第一个,如果,任何想法如何解决这个问题? .Code bellow:
private var users:[User] = [] // User is a class that implements NSCoding
private let ramCache = NSCache<NSString,NSArray>()
private var filePath:String{
let manager = FileManager.default
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
return url!.appendingPathComponent("SavedData").path
}
private func saveData(user: User) { // this is called in function requestFromApi()
self.users.append(user)
NSKeyedArchiver.archiveRootObject(users, toFile: filePath) // we save on disk
ramCache.setObject(self.users as NSArray, forKey: "Data" as NSString)
// print(self.users as NSArray)
}
private func loadData() {
if let cachedVersion = ramCache.object(forKey: "Data" as NSString){ // this is null everytime
// check if its on ram
print("data was on ram")
self.users = cachedVersion as! [User]
}
else if let savedUsers = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? [User] {
// check if its on disk
print("data was on disk")
self.users = savedUsers
} else {
print("we requested the data")
self.requestDataFromApi()
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.loadData()
tableView.delegate = self
tableView.dataSource = self
let nibName = UINib(nibName: "CustomTableViewCell", bundle: nil)
tableView.register(nibName, forCellReuseIdentifier: "tableViewCell")
}
答案 0 :(得分:1)
我建议再看一下URLCache。它具有RAM和基于磁盘的缓存。我通常会在应用启动时增加每个限制。使用这种方法,响应头中指定的缓存限制将受到尊重,因此如果这些限制不正确,您也需要修复它。
func initializeURLCache() {
let memoryCapacity = 10 * 1024 * 1024 // 10 MB (up from default of 512 KB)
let diskCapacity = 100 * 1024 * 1024 // 100 MB (up from default of 1 MB)
let sharedCache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: nil)
URLCache.shared = sharedCache
logger.info("Disk cache used \(URLCache.shared.currentDiskUsage) of \(URLCache.shared.diskCapacity)")
}