Di iPhone, saya melakukan permintaan HTTP menggunakan NSURLRequest untuk sebagian data. Alokasi objek melonjak dan saya menetapkan data yang sesuai. Ketika saya selesai dengan datanya, saya membebaskannya - namun instrumen tidak menunjukkan data apa pun yang telah dibebaskan!
Teori saya adalah bahwa secara default permintaan HTTP di-cache, namun - saya tidak ingin aplikasi iPhone saya menyimpan data ini ke cache.
Apakah ada cara untuk menghapus cache ini setelah ada permintaan atau mencegah data apa pun disimpan di cache?
Saya sudah mencoba menggunakan semua kebijakan cache yang didokumentasikan sedikit seperti di bawah ini:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
tapi sepertinya tidak ada yang bisa membebaskan memori!
cocoa-touch
caching
Nick Cartwright
sumber
sumber
Jawaban:
Biasanya lebih mudah membuat permintaan seperti ini
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
Kemudian buat koneksi
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
dan menerapkan metode koneksi: willCacheResponse: pada delegasi. Hanya mengembalikan nol harus melakukannya.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; }
sumber
NSURLRequestReloadIgnoringCacheData
dan menerapkanconnection:willCacheResponse:
?connection:willCacheResponse:
memungkinkan Anda untuk tidak menyimpan respons di cache.NSURLRequestReloadIgnoringCacheData
menentukan bahwa koneksi harus memuat permintaan tanpa memeriksa cache. Yang pertama mungkin yang membantu mengelola alokasi memori.Saya memiliki masalah yang sama di aplikasi saya ketika saya meminta info dari twitter. Dalam kasus saya, saya tidak perlu mempertahankan kredensial tersebut, jadi saya cukup menghapusnya menggunakan kode berikut:
- (void) eraseCredentials{ NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage]; NSDictionary *allCredentials = [credentialsStorage allCredentials]; //iterate through all credentials to find the twitter host for (NSURLProtectionSpace *protectionSpace in allCredentials) if ([[protectionSpace host] isEqualToString:@"twitter.com"]){ //to get the twitter's credentials NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace]; //iterate through twitter's credentials, and erase them all for (NSString *credentialKey in credentials) [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace]; } }
Saya harap ini berhasil untuk seseorang :)
sumber
Jika Anda menggunakan NSURLConnection, lihat delegasi:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
Nilai Kembali
Respons aktual yang di-cache untuk disimpan di cache. Delegasi dapat mengembalikan cachedResponse tanpa modifikasi, mengembalikan respons cache yang dimodifikasi, atau mengembalikan nihil jika tidak ada respons yang di-cache harus disimpan untuk koneksi.
sumber
Jika Anda menggunakan
NSURLSession
, solusi lain untuk mencegah permintaan dan parameter ditulis keCache.db
iOS yang dibuat dalamCaches
direktori aplikasi , adalah dengan menyetelNSURLCache
konfigurasi sesi ke memori ukuran 0 dan cache disk ukuran 0, misalnya.let configuration = URLSessionConfiguration.default configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) let session = URLSession(configuration: configuration)
atau seperti yang disebutkan di atas disetel pada tingkat cache global
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
Agaknya 0 untuk ukuran disk yang menghentikan penulisan iOS ke disk, tetapi jika Anda memiliki kebijakan untuk
reloadIgnoringLocalCacheData
itu, Anda mungkin juga tidak tertarik dengan cache memori.Catatan Ini akan mencegah semua
Caches/Cache.db
(permintaan & tanggapan) atauCaches/fsCachedData/
folder (data tanggapan) dibuat. Kami telah memutuskan untuk mengambil pendekatan ini di aplikasi untuk tujuan keamanan karena kami tidak ingin permintaan kami disimpan di cache disk.Jika ada yang tahu apakah ada cara untuk berhenti hanya meminta cache tetapi menyimpan cache data respons dari mekanisme Pemuatan URL iOS, saya akan tertarik untuk mengetahuinya. (tidak ada API atau dokumentasi resmi tentang ini dari apa yang saya tahu)
sumber
Jika tidak spesifik untuk satu permintaan (Anda ingin menonaktifkan cache untuk seluruh aplikasi) di bawah ini adalah opsi terbaik. Tambahkan kode ini di delegasi aplikasi atau berdasarkan kebutuhan Anda di mana saja
int cacheSizeMemory = 0*4*1024*1024; // 0MB int cacheSizeDisk = 0*32*1024*1024; // 0MB NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache];
sumber
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url]; [request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
Dengan asumsi server diimplementasikan dengan benar, meletakkan
Cache-Control:no-store
header dalam permintaan akan menghasilkan respons server dengan header yang sama, sehingga menyebabkanNSURLCache
data respons tidak disimpan pada disk.Oleh karena itu, tidak perlu pendekatan senapan untuk menonaktifkan
NSURLCache
cache disk.PS: Menambahkan header seharusnya berfungsi untuk semua kerangka kerja HTTP, seperti
AFNetworking
sumber