Skip to content

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 ​

  1. Set appropriate disk space limits
  2. Implement efficient cleanup strategies
  3. Handle file system errors
  4. Consider file system permissions
  5. Monitor disk usage

Created by Eren Demir.