Caches Directory — је директоријум у пешчанику iOS апликације, намењен за чување привремених података који се могу обновити или поново учитати из мреже. Према Apple File System Basics (2024), систем може у било ком тренутку обрисати датотеке из Caches Directory-а да би ослободио простор на диску — апликација мора правилно да обради одсуство ових датотека и да их по потреби обнови. За разлику од Documents Directory-а, подаци из Caches-а нису укључени у резервну копију iCloud и iTunes, што смањује оптерећење складишта у облаку корисника.
Главне тачке
Caches Directory — је директоријум унутар пешчаника iOS апликације, оптимизован за чување података који се могу обновити по потреби. За разлику од Documents Directory-а, Caches није намењен за корисничке податке — то је привремено складиште за убрзавање рада апликације.
iOS користи Caches Directory за смештање кешираних мрежних одговора, претходно учитаних слика, серијализованих објеката и података које апликација може да обнови. Програмер не треба да се ослања на дугорочно чување података у овом директоријуму.
Према подацима Apple WWDC 2020, око 40% iOS апликација користи Caches Directory за чување кешираних слика и мрежних података, при чему 25% програмера неправилно смешта у Caches податке који би требало да буду у Documents или Application Support, због неразумевања разлика између ових директоријума.
Критично својство Caches: апликација мора правилно да обради ситуацију када је датотека из кеша обрисана од стране система. Ако се након брисања кеша функционалност апликације наруши — то значи да се подаци чувају у погрешном директоријуму.
У Swift-у путања до Caches Directory-а се добија стандардним методом FileManager са навођењем .cachesDirectory. То је једноставна операција која се користи практично у свакој iOS апликацији која ради са мрежним подацима.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Сачувај кеширани JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C користи NSSearchPathForDirectoriesInDomains са NSCachesDirectory. Иако Apple препоручује Swift API, Objective-C код са Caches Directory-ом остаје радан и подржан.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
Swift пројекти треба да преферирају URL-базирани API: он је типски безбедан и боље се интегрише са модерним фрејмворцима попут SwiftUI и Combine.
Caches Directory је оптималан за неколико категорија података које апликација користи за убрзавање рада, али није једини извор истине. Правилан избор података за кеширање директно утиче на UX и перформансе апликације.
JSON одговори са API-ја, подаци вести, листе објеката — све што апликација може поново да учита са сервера. Користите URLCache за аутоматско кеширање HTTP одговора или ручно чувајте серијализоване објекте.
Слике учитане из мреже — најчешћи случај коришћења Caches Directory-а. Библиотеке попут SDWebImage и Kingfisher подразумевано чувају кеширане слике управо у Caches-у.
| Тип података | Погодно за Caches | Рок чувања |
|---|---|---|
| JSON API одговори | Да | До чишћења система |
| Слике из мреже | Да | До чишћења система |
| Дневници отклањања грешака | Условно | Боље у tmp |
| Чувања игара | Не | Само Documents |
| Конфигурације апликације | Не | Application Support |
Ако се подаци не могу обновити — њихово место није у Caches-у. Ово је најједноставнији критеријум: замислите да сутра систем обрише све датотеке из Caches-а. Ако апликација настави да ради исправно — подаци се чувају правилно.
iOS аутоматски управља чишћењем Caches Directory-а, али тачни окидачи и алгоритми нису документовани од стране Apple-а. Познато је да систем може брисати датотеке из Caches-а када нема довољно простора на диску, као и при раду функције Offload Unused Apps.
Процес чишћења је транспарентан за апликацију: систем брише датотеке без обавештења. Апликација мора проверити постојање датотеке пре читања и поново је креирати ако недостаје. Неослањање на дугорочно чување — кључни захтев при раду са Caches-ом.
Према чланку Apple "File System Basics" (2024), апликација не треба да рачуна да ће датотеке у Caches Directory-у бити доступне између сесија. Програмерима се препоручује да имплементирају fallback механизам: при недостатку кеширане датотеке — учитајте податке из мреже и поново сачувајте у Caches-у.
Посебан сценарио — истовар апликације (Offload). При активацији ове функције, iOS брише апликацију али чува њен Documents Directory. Caches Directory се при томе брише. Корисник који је обновио апликацију неће добити кеширане податке — апликација мора да их поново учита.
Разлика између Caches и Temporary (tmp) директоријума често изазива забуну код програмера. Оба директоријума чувају привремене податке, али са различитим гаранцијама животног века и наменом.
| Карактеристика | Caches Directory | Temporary Directory |
|---|---|---|
| Животни век | Од сесије до сесије (није гарантовано) | Само у оквиру сесије |
| Чишћење од стране система | При недостатку простора | При завршетку сесије или поновном покретању |
| Намена | Кеш за убрзавање рада | Веома привремени подаци |
| Пример | Кеширане слике | Привремени фајл пре извоза |
| Резервна копија | Не | Не |
Изаберите Caches ако је податке корисно сачувати између покретања апликације, али се могу обновити. Користите tmp ако су подаци потребни само у текућој сесији и немају вредност након завршетка апликације.
Рад са Caches Directory-ом захтева поштовање неколико правила која помажу у избегавању губитка података, неочекиваног понашања апликације и проблема са перформансама.
FileManager.fileExists(atPath:) треба позвати пре сваког читања из Caches-а. Ако датотека недостаје — учитајте податке из изворног извора и сачувајте у кеш. Никада не претпостављајте да датотека из Caches-а постоји.
Поставите максималну величину Caches Directory-а у апликацији. На пример, лимит од 50 MB за слике и 10 MB за JSON одговоре. При прекорачењу лимита, обришите најстарије датотеке по датуму измене.
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 }
// Наброји и обриши старе датотеке
// при прекорачењу лимита величине
}
Поштовање ових пракси гарантује да апликација ради исправно при свим акцијама система за чишћење кеша, а корисник се не суочава са неочекиваним губитком података.
Често постављана питања
Не, iOS не шаље обавештења пре брисања датотека из Caches-а. Процес чишћења је потпуно транспарентан за апликацију. Једини начин да сазнате за брисање — при покушају читања датотеке FileManager враћа nil или баца грешку, а апликација мора да обради ову ситуацију.
Директан приступ Caches Directory-у преко Files-а или iTunes-а корисник нема. Међутим, корисник може обрисати кеш свих апликација преко Подешавања > Опште > Складиште, бирајући конкретну апликацију и притискајући "Истовари апликацију". iOS такође може аутоматски чистити кеш при недостатку простора.
URLCache — је уграђени механизам кеширања HTTP захтева из Foundation-а. Он аутоматски чува и учитава кеширане одговоре, користећи Caches Directory у позадини. Ручно чување даје више контроле: можете изабрати формат, шифровати податке и управљати животним веком сваке датотеке појединачно.
При ажурирању апликације кроз App Store, Caches Directory се чува. Међутим, садржај може бити обрисан од стране система ако ново ажурирање захтева више простора за инсталацију. Програмер не треба да се ослања на очување Caches-а након ажурирања — ово је додатни разлог за имплементацију fallback механизма.
Поставите URLCache на nil за конкретну NSURLSession сесију или користите политику кеширања .reloadIgnoringLocalCacheData. Такође можете креирати конфигурацију URLSessionConfiguration са празним кешом: sessionConfiguration.urlCache = nil. Ово је корисно за податке који увек морају бити ажурни.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође