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à 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.
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.
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ợ.
@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ư SwiftUI và Combine.
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 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 đượ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ệu | Phù hợp với Caches | Thời gian lưu trữ |
|---|---|---|
| JSON phản hồi API | Có | Đến khi hệ thống dọn |
| Hình ảnh từ mạng | Có | Đến khi hệ thống dọn |
| Nhật ký gỡ lỗi | Có điều kiện | Tốt hơn trong tmp |
| Lưu trò chơi | Không | Chỉ Documents |
| Cấu hình ứng dụng | Không | Application 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.
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.
Sự khác biệt giữa thư mục Caches và Temporary (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ểm | Caches Directory | Temporary Directory |
|---|---|---|
| Thời gian sống | Từ 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ống | Khi thiếu dung lượng | Khi kết thúc phiên hoặc khởi động lại |
| Mục đích | Bộ nhớ đệm để tăng tốc hiệu suất | Dữ liệu rất tạm thời |
| Ví dụ | Hình ảnh được lưu trong bộ nhớ đệm | Tệp tạm thời trước khi xuất |
| Sao lưu | Không | Khô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.
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.
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.
Đặ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.
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
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 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 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ẻ.
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.
Đặ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
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.
Đọc thêm