Disk Cache
Disk caching is a technique for storing data persistently on the device's storage system to improve application performance and reduce network usage.
Overview
Disk caching provides a way to store larger amounts of data that can persist between app launches and survive memory pressure situations.
Implementation
swift
// Example implementation in Swift
class DiskCache {
private let fileManager = FileManager.default
private let cacheDirectory: URL
private let maxDiskSpace: Int64
init(maxDiskSpace: Int64 = 100 * 1024 * 1024) { // 100MB default
self.maxDiskSpace = maxDiskSpace
let paths = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)
cacheDirectory = paths[0].appendingPathComponent("DiskCache")
try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true)
}
func save(data: Data, key: String) {
let fileURL = cacheDirectory.appendingPathComponent(key)
// Check disk space
if getCurrentDiskUsage() + Int64(data.count) > maxDiskSpace {
cleanupOldFiles()
}
try? data.write(to: fileURL)
}
func load(key: String) -> Data? {
let fileURL = cacheDirectory.appendingPathComponent(key)
return try? Data(contentsOf: fileURL)
}
private func getCurrentDiskUsage() -> Int64 {
guard let contents = try? fileManager.contentsOfDirectory(at: cacheDirectory, includingPropertiesForKeys: [.fileSizeKey]) else {
return 0
}
return contents.reduce(0) { sum, url in
sum + ((try? url.resourceValues(forKeys: [.fileSizeKey]).fileSize) ?? 0)
}
}
private func cleanupOldFiles() {
guard let contents = try? fileManager.contentsOfDirectory(at: cacheDirectory, includingPropertiesForKeys: [.creationDateKey]) else {
return
}
let sortedFiles = contents.sorted { url1, url2 in
let date1 = try? url1.resourceValues(forKeys: [.creationDateKey]).creationDate
let date2 = try? url2.resourceValues(forKeys: [.creationDateKey]).creationDate
return date1 ?? Date() < date2 ?? Date()
}
for file in sortedFiles {
try? fileManager.removeItem(at: file)
if getCurrentDiskUsage() < maxDiskSpace {
break
}
}
}
}
Best Practices
- Set appropriate disk space limits
- Implement efficient cleanup strategies
- Handle file system errors
- Consider file system permissions
- Monitor disk usage