هل من الممكن منع NSURLRequest من تخزين البيانات مؤقتًا أو إزالة البيانات المخزنة مؤقتًا بعد الطلب؟

StackOverflow https://stackoverflow.com/questions/405151

  •  03-07-2019
  •  | 
  •  

سؤال

على iPhone، أقوم بتنفيذ طلب HTTP باستخدام NSURLRequest لمجموعة من البيانات.يرتفع تخصيص الكائنات وأقوم بتعيين البيانات وفقًا لذلك.عندما أنتهي من البيانات، أقوم بتحريرها وفقًا لذلك - ولكن الأدوات لا تظهر أي بيانات قد تم تحريرها!

نظريتي هي أن طلبات HTTP يتم تخزينها مؤقتًا بشكل افتراضي، ومع ذلك - لا أريد أن يقوم تطبيق iPhone الخاص بي بتخزين هذه البيانات مؤقتًا.

هل هناك طريقة لمسح ذاكرة التخزين المؤقت هذه بعد الطلب أو منع تخزين أي بيانات مؤقتًا في المقام الأول؟

لقد حاولت استخدام جميع سياسات ذاكرة التخزين المؤقت الموثقة قليلاً كما هو موضح أدناه:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

ولكن يبدو أن لا شيء يحرر الذاكرة!

هل كانت مفيدة؟

المحلول

وعادة ما يكون من الأسهل لإنشاء طلب مثل هذا

NSURLRequest *request = [NSURLRequest requestWithURL:url
      cachePolicy:NSURLRequestReloadIgnoringCacheData
      timeoutInterval:60.0];

وثم إنشاء الاتصال

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
       delegate:self];

ووتنفيذ إتصال: willCacheResponse: الأسلوب على مندوب. الذي عاد للتو لا شيء ينبغي أن نفعل ذلك.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
  return nil;
}

نصائح أخرى

ولدي نفس المشكلة في تطبيقي عندما طلبت المعلومات من تويتر. في حالتي لم أكن في حاجة للحفاظ على وثائق التفويض، ولذا فإنني بسيطة محو لهم باستخدام رمز المقبل:

- (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];
    }
}

وآمل أن يعمل لشخص ما:)

إذا كنت تستخدم NSURLConnection، قم بإلقاء نظرة على المفوض:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

قيمة الإرجاع

الاستجابة الفعلية المخزنة مؤقتًا للتخزين في ذاكرة التخزين المؤقت.قد يقوم المفوض بإرجاع استجابة مخبأة غير معدلة، أو إرجاع استجابة مخبأة معدلة، أو إرجاع لا شيء إذا لم يتم تخزين أي استجابة مخبأة للاتصال.

إذا لم محددة لطلب واحد (U تريد تعطيل مخبأ للبرنامج كله) أقل من واحد هو أفضل option.Add هذا الرمز في مندوب التطبيق أو على أساس الحاجة اور في أي مكان

        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];

إذا كنت تستخدم NSURLSession, ، حل آخر لمنع كتابة الطلب والمعلمات إلى ملف Cache.db يقوم iOS بإنشاء داخل التطبيق Caches الدليل، هو تعيين NSURLCache لتكوين الجلسة إلى أ ذاكرة بحجم 0 وذاكرة تخزين مؤقت على القرص بحجم 0 على سبيل المثال

let configuration = URLSessionConfiguration.default    
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)

أو كما هو مذكور أعلاه تم تعيينه على مستوى ذاكرة التخزين المؤقت العالمية

URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

من المفترض أن الرقم 0 لحجم القرص هو الذي يمنع iOS من الكتابة إلى القرص ولكن إذا كانت لديك سياسة لذلك reloadIgnoringLocalCacheData فمن المحتمل أنك لست مهتمًا بالتخزين المؤقت للذاكرة أيضًا.

ملحوظة وهذا سيمنع أي Caches/Cache.db (الطلبات والردود) أو Caches/fsCachedData/ يتم إنشاء المجلد (بيانات الاستجابة) على الإطلاق.لقد قررنا اتباع هذا النهج في أحد التطبيقات لأغراض أمنية لأننا لا نريد تخزين طلباتنا على ذاكرة التخزين المؤقت على القرص على الإطلاق.

إذا كان أي شخص يعرف أن هناك طريقة لإيقاف التخزين المؤقت للطلب فقط مع الاحتفاظ بالتخزين المؤقت لبيانات الاستجابة من آلية تحميل عنوان URL لنظام التشغيل iOS، سأكون مهتمًا بمعرفة ذلك.(لا توجد واجهة برمجة تطبيقات أو وثائق رسمية حول هذا الأمر مما يمكنني قوله)

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

وإذا افترضنا يتم تنفيذ الملقم بشكل صحيح، ووضع رأس Cache-Control:no-store في الطلب سوف تولد استجابة الملقم مع نفس الرأس، مما تسبب في NSURLCache لعدم تخزين البيانات على القرص استجابة.

لذلك، لا حاجة لنهج طلقات نارية من تعطيل التخزين المؤقت على القرص NSURLCache.

وPS: يجب إضافة رأس العمل لجميع الأطر HTTP، مثل AFNetworking

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top