Caches Directory: khái niệm, quản lý bộ nhớ đệm và dọn dữ liệu

Tác giả: IT Sectr Đã đăng: 2026-07-10 Thời gian đọc: 10 phút

Caches Directory là một thư mục trong sandbox của ứng dụng iOS được thiết kế để lưu trữ dữ liệu tạm thời có thể khôi phục hoặc tải lại từ mạng. Theo Apple File System Basics (2024), hệ thống có thể xóa tệp khỏi Caches Directory bất kỳ lúc nào để giải phóng dung lượng đĩa. Ứng dụng phải xử lý đúng cách sự vắng mặt của các tệp này và khôi phục chúng khi cần. Không giống như Documents Directory, dữ liệu từ Caches không được bao gồm trong bản sao lưu iCloud và iTunes, giúp giảm tải cho bộ nhớ đám mây của người dùng.

Điểm Chính

  • Caches Directory là bộ nhớ tạm thời cho dữ liệu có thể khôi phục từ mạng hoặc tạo lại.
  • Hệ thống iOS có thể bất kỳ lúc nào xóa tệp khỏi Caches khi thiết bị thiếu dung lượng.
  • Dữ liệu từ Caches không được bao gồm trong bản sao lưu iCloud và iTunes.
  • Đường dẫn đến thư mục được lấy qua NSCachesDirectory hoặc FileManager.urls(for: .cachesDirectory).
  • Sự khác biệt chính với Documents: Caches không dành cho dữ liệu người dùng mà việc mất mát là nghiêm trọng.

Caches Directory trong iOS là gì?

Caches Directory là một thư mục bên trong sandbox của ứng dụng iOS được tối ưu hóa để lưu trữ dữ liệu có thể khôi phục khi cần. Không giống như Documents Directory, Caches không dành cho dữ liệu người dùng mà là bộ nhớ tạm thời để tăng tốc hiệu suất ứng dụng.

iOS sử dụng Caches Directory để lưu trữ các phản hồi mạng được lưu trong bộ nhớ đệm, hình ảnh được tải trước, đối tượng được tuần tự hóa và dữ liệu mà ứng dụng có thể khôi phục. Nhà phát triển không nên dựa vào việc lưu trữ dữ liệu dài hạn trong thư mục này.

Theo Apple WWDC 2020, khoảng 40% ứng dụng iOS sử dụng Caches Directory để lưu trữ hình ảnh và dữ liệu mạng được lưu trong bộ nhớ đệm, trong khi 25% nhà phát triển đặt sai dữ liệu trong Caches mà đáng lẽ phải ở Documents hoặc Application Support do không hiểu sự khác biệt giữa các thư mục này.

Một thuộc tính quan trọng của Caches: ứng dụng phải xử lý đúng cách các tình huống khi tệp bộ nhớ đệm bị hệ thống xóa. Nếu việc xóa bộ nhớ đệm làm hỏng chức năng ứng dụng, thì dữ liệu đang được lưu trữ ở sai thư mục.

Cách lấy đường dẫn đến Caches Directory

Trong Swift, đường dẫn đến Caches Directory được lấy bằng phương thức FileManager chuẩn với .cachesDirectory. Đây là thao tác đơn giản được sử dụng trong hầu hết các ứng dụng iOS làm việc với dữ liệu mạng.

swift
import Foundation

let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
    for: .cachesDirectory,
    in: .userDomainMask
).first else { return }

// Save cached JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
    withJSONObject: response,
    options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)

Objective-C sử dụng NSSearchPathForDirectoriesInDomains với NSCachesDirectory. Mặc dù Apple khuyến nghị API Swift, mã Objective-C với Caches Directory vẫn hoạt động và được hỗ trợ.

objective-c
@import Foundation;

NSArray *paths = NSSearchPathForDirectoriesInDomains(
    NSCachesDirectory,
    NSUserDomainMask,
    YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];

Các dự án Swift nên ưu tiên API dựa trên URL: nó an toàn về kiểu và tích hợp tốt hơn với các framework hiện đại như SwiftUICombine.

Dữ liệu nào nên lưu trong Caches

Caches Directory là tối ưu cho một số loại dữ liệu mà ứng dụng sử dụng để tăng tốc hiệu suất, nhưng không phải là nguồn duy nhất. Việc chọn đúng dữ liệu để lưu vào bộ nhớ đệm ảnh hưởng trực tiếp đến UX và hiệu suất ứng dụng.

Phản hồi mạng được lưu trong bộ nhớ đệm

Phản hồi JSON từ API, dữ liệu nguồn tin, danh sách đối tượng. Tất cả những gì ứng dụng có thể tải lại từ máy chủ. Sử dụng URLCache để tự động lưu bộ nhớ đệm các phản hồi HTTP hoặc lưu thủ công các đối tượng đã được tuần tự hóa.

Hình ảnh và tệp phương tiện

Hình ảnh được tải xuống từ mạng là trường hợp sử dụng phổ biến nhất của Caches Directory. Các thư viện như SDWebImage và Kingfisher theo mặc định lưu hình ảnh đã được lưu trong bộ nhớ đệm vào Caches.

Loại dữ liệuPhù hợp với CachesThời gian lưu trữ
JSON phản hồi APIĐến khi hệ thống dọn
Hình ảnh từ mạngĐến khi hệ thống dọn
Nhật ký gỡ lỗiCó điều kiệnTốt hơn trong tmp
Lưu trò chơiKhôngChỉ Documents
Cấu hình ứng dụngKhôngApplication Support

Nếu dữ liệu không thể khôi phục, thì chúng không thuộc về Caches. Đây là tiêu chí đơn giản nhất: hãy tưởng tượng ngày mai hệ thống sẽ xóa tất cả tệp khỏi Caches. Nếu ứng dụng tiếp tục hoạt động bình thường, dữ liệu được lưu trữ đúng cách.

Hệ thống quản lý dọn bộ nhớ đệm như thế nào

iOS tự động quản lý việc dọn Caches Directory, nhưng các trình kích hoạt và thuật toán chính xác không được Apple ghi lại. Được biết, hệ thống có thể xóa tệp khỏi Caches khi dung lượng đĩa thấp, cũng như khi tính năng Offload Unused Apps được kích hoạt.

Quá trình dọn dẹp minh bạch đối với ứng dụng: hệ thống xóa tệp mà không thông báo. Ứng dụng phải kiểm tra sự tồn tại của tệp trước khi đọc và tạo lại nếu không có. Không dựa vào lưu trữ dài hạn là yêu cầu chính khi làm việc với Caches.

Theo bài viết của Apple “File System Basics” (2024), ứng dụng không nên mong đợi rằng các tệp trong Caches Directory sẽ có sẵn giữa các phiên làm việc. Các nhà phát triển nên triển khai cơ chế dự phòng: nếu tệp bộ nhớ đệm bị thiếu, hãy tải dữ liệu từ mạng và lưu lại vào Caches.

Một kịch bản riêng biệt là Offload ứng dụng. Khi tính năng này được kích hoạt, iOS xóa ứng dụng nhưng giữ lại Documents Directory của nó. Caches Directory bị xóa trong quá trình này. Người dùng khôi phục ứng dụng sẽ không có dữ liệu bộ nhớ đệm và ứng dụng phải tải lại.

Caches Directory so với Temporary Directory

Sự khác biệt giữa thư mục CachesTemporary (tmp) thường gây nhầm lẫn cho các nhà phát triển. Cả hai thư mục đều lưu trữ dữ liệu tạm thời, nhưng với các đảm bảo về thời gian sống và mục đích khác nhau.

Đặc điểmCaches DirectoryTemporary Directory
Thời gian sốngTừ phiên này sang phiên khác (không đảm bảo)Chỉ trong một phiên
Dọn bởi hệ thốngKhi thiếu dung lượngKhi kết thúc phiên hoặc khởi động lại
Mục đíchBộ nhớ đệm để tăng tốc hiệu suấtDữ liệu rất tạm thời
Ví dụHình ảnh được lưu trong bộ nhớ đệmTệp tạm thời trước khi xuất
Sao lưuKhôngKhông

Chọn Caches nếu việc giữ dữ liệu giữa các lần khởi động ứng dụng là hữu ích nhưng có thể khôi phục được. Sử dụng tmp nếu dữ liệu chỉ cần trong phiên hiện tại và không có giá trị sau khi ứng dụng kết thúc.

Thực hành tốt nhất với Caches

Làm việc với Caches Directory đòi hỏi tuân thủ một số quy tắc giúp tránh mất dữ liệu, hành vi ứng dụng không mong đợi và các vấn đề về hiệu suất.

Luôn kiểm tra sự tồn tại của tệp trước khi đọc

FileManager.fileExists(atPath:) phải được gọi trước mỗi lần đọc từ Caches. Nếu tệp bị thiếu, hãy tải dữ liệu từ nguồn gốc và lưu vào bộ nhớ đệm. Đừng bao giờ cho rằng tệp trong Caches tồn tại.

Giới hạn kích thước bộ nhớ đệm

Đặt kích thước tối đa cho Caches Directory trong ứng dụng của bạn. Ví dụ, giới hạn 50 MB cho hình ảnh và 10 MB cho phản hồi JSON. Khi vượt quá giới hạn, hãy xóa các tệp cũ nhất theo ngày sửa đổi.

swift
import Foundation

func trimCache(to maxSizeBytes: Int) {
    let cachesURL = FileManager.default
        .urls(for: .cachesDirectory, in: .userDomainMask)
        .first!

    guard let enumerator = FileManager.default
        .enumerator(
            at: cachesURL,
            includingPropertiesForKeys: [.fileSizeKey, .contentModificationDateKey]
        )
    else { return }

    // Enumerate and remove old files
    // when exceeding size limit
}

Tuân thủ các thực hành này đảm bảo ứng dụng hoạt động chính xác bất kể hành động dọn bộ nhớ đệm của hệ thống, và người dùng không gặp phải tình trạng mất dữ liệu bất ngờ.

Câu hỏi thường gặp

Hệ thống có thông báo cho ứng dụng trước khi dọn Caches Directory không?

Không, iOS không gửi thông báo trước khi xóa tệp khỏi Caches. Quá trình dọn dẹp hoàn toàn minh bạch đối với ứng dụng. Cách duy nhất để biết tệp đã bị xóa là khi cố gắng đọc tệp đó. FileManager trả về nil hoặc báo lỗi và ứng dụng phải xử lý tình huống này.

Người dùng có thể tự dọn Caches Directory không?

Người dùng không có quyền truy cập trực tiếp vào Caches Directory qua Files hoặc iTunes. Tuy nhiên, họ có thể dọn bộ nhớ đệm của tất cả ứng dụng qua Cài đặt > Cài đặt chung > Dung lượng, chọn một ứng dụng cụ thể và nhấn “Offload App.” iOS cũng có thể tự động dọn bộ nhớ đệm khi thiếu dung lượng.

URLCache khác gì so với việc lưu thủ công trong Caches Directory?

URLCache là cơ chế lưu bộ nhớ đệm tích hợp sẵn cho các yêu cầu HTTP từ Foundation. Nó tự động lưu và tải các phản hồi đã được lưu trong bộ nhớ đệm, sử dụng Caches Directory bên trong. Việc lưu thủ công mang lại nhiều quyền kiểm soát hơn: bạn có thể chọn định dạng, mã hóa dữ liệu và quản lý thời gian sống của từng tệp riêng lẻ.

Điều gì xảy ra với Caches Directory khi cập nhật ứng dụng?

Khi cập nhật ứng dụng qua App Store, Caches Directory được giữ lại. Tuy nhiên, nội dung có thể bị hệ thống xóa nếu bản cập nhật mới yêu cầu nhiều dung lượng hơn để cài đặt. Nhà phát triển không nên dựa vào việc Caches sẽ còn sau khi cập nhật. Đây là một lý do bổ sung để triển khai cơ chế dự phòng.

Làm thế nào để tắt tự động lưu bộ nhớ đệm cho NSURLSession?

Đặt URLCache thành nil cho một phiên NSURLSession cụ thể hoặc sử dụng chính sách bộ nhớ đệm .reloadIgnoringLocalCacheData. Bạn cũng có thể tạo URLSessionConfiguration với bộ nhớ đệm trống: sessionConfiguration.urlCache = nil. Điều này hữu ích cho dữ liệu luôn phải được cập nhật.

Tổng kết

  • Caches Directory là bộ nhớ tạm thời cho dữ liệu có thể khôi phục từ mạng hoặc tạo lại.
  • Hệ thống iOS có thể bất kỳ lúc nào xóa tệp khỏi Caches mà không thông báo ứng dụng.
  • Dữ liệu từ Caches không được bao gồm trong bản sao lưu iCloud và iTunes, tiết kiệm dung lượng.
  • Đường dẫn đến thư mục là FileManager.urls(for: .cachesDirectory) trong Swift hoặc NSSearchPathForDirectoriesInDomains trong Objective-C.
  • Caches lưu trữ hình ảnh đã được lưu trong bộ nhớ đệm, phản hồi JSON API và các dữ liệu có thể khôi phục khác.
  • Không giống tmp, Caches có thể giữ dữ liệu giữa các lần khởi động, nhưng không đảm bảo.
  • Luôn kiểm tra sự tồn tại của tệp trước khi đọc từ Caches và triển khai tải dự phòng.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm