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.