কোনও এনএসআরএলকে অনুরোধের পরে ডেটা ক্যাচিং করা থেকে আটকাতে বা ক্যাশেড ডেটা সরিয়ে ফেলা সম্ভব?


90

আইফোনে, আমি এনএসআরএল অনুরোধটি ডেটাগুলির একটি অংশের জন্য ব্যবহার করে একটি HTTP অনুরোধ সম্পাদন করি। অবজেক্ট বরাদ্দ স্পাইক এবং আমি সেই অনুযায়ী ডেটা বরাদ্দ করি। আমি যখন ডেটা শেষ করি, ততক্ষণে আমি এটিকে মুক্ত করে দিই - তবে যন্ত্রগুলি কোনও ডেটা খালি করা দেখায় না!

আমার তত্ত্বটি হ'ল ডিফল্টরূপে HTTP অনুরোধগুলি ক্যাশে করা হয় - তবে আমি চাই না যে আমার আইফোন অ্যাপ্লিকেশনটি এই ডেটাটি ক্যাশে করে।

কোনও অনুরোধের পরে এই ক্যাশেটি সাফ করার কোনও উপায় আছে বা কোনও ডেটা প্রথম স্থানে ক্যাশে হওয়া থেকে বিরত থাকতে পারে?

আমি নীচে কিছুটা নথিযুক্ত সমস্ত ক্যাশে নীতিগুলি ব্যবহার করার চেষ্টা করেছি:

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

কিন্তু কিছুই মনে হয় না স্মৃতি মুক্ত!


এটি কি সম্ভব যে এটি ক্যাশে সম্পর্কিত নয়? আপনি কি ডেটাটি পরীক্ষা করে দেখার চেষ্টা করেছেন যে ডেটা যে পুনরায় লোড করা উচিত ছিল তা আসলে পুরানো কিনা? হয়তো আপনার কোথাও অন্য কোথাও থেকে আসছে। আপনি কীভাবে এনএসআরএল অনুসন্ধানগুলি আরম্ভ এবং মুক্ত করবেন? সমস্যাটি নির্ণয় করতে এটি সহায়ক হতে পারে।
lpfavreau

এফওয়াইআই - আপনি যদি নৃশংস

উত্তর:


158

সাধারণত অনুরোধটি তৈরি করা সহজ

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

তারপরে সংযোগটি তৈরি করুন

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

এবং সংযোগটি বাস্তবায়িত করুন: উইলক্যাশরেসপনস: প্রতিনিধিটির উপর পদ্ধতি। শুধু ফিরে শূন্য এটি করা উচিত।

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

আপনার সাহায্যের জন্য এখানে অনেক ধন্যবাদ! নিক।
নিক কার্টরাইট

4
এই ধারণার জন্য ধন্যবাদ - আমি বার বার এই জাতীয় একটি এসওএপি ওয়েব পরিষেবা কল করছিলাম এবং এটি অনিয়ন্ত্রিতভাবে গাদা বাড়িয়ে দিচ্ছিল যদিও ফাঁসগুলি কোনও কিছু ভুল দেখায় নি। আমি বেশ কয়েকদিন ধরে অপ্টিমাইজ করেছি এবং শেষ পর্যন্ত অভ্যন্তরীণ কাঠামোর অনেকগুলি সিএফআরএল * অবজেক্টের চারদিকে ঝুলতে থাকায় ক্যাশে প্রতিরোধ করার চেষ্টা করেছি। উইলচেয়ারেস্পোনস থেকে শূন্য ফিরে আসাটাই কেবল কাজ করেছিল!
ব্রোন ডেভিস

15
কেন উভয়ই করা NSURLRequestReloadIgnoringCacheData এবং বাস্তবায়ন করা প্রয়োজন connection:willCacheResponse:?
ফেব্ব

4
হাই, আমি কি এটি স্থানীয় সামগ্রী লোড করার জন্য ব্যবহার করতে পারি? উপরেরটি এনএসইউরল কানেকশনের জন্য তবে আমি এনএসইউরলকোয়েস্ট ব্যবহার করে স্থানীয় এইচটিএমএল ডেটা ইউআইওউবভিউতে লোড করছি। এসকিউএলাইট থেকে ওয়েবভিউতে আসা চিত্রগুলি রয়েছে এবং আমার পৃষ্ঠা লোডের সাথে মেমরিটি বাড়ছে বলে আমাকে কোনও ক্যাচিং প্রত্যাখ্যান করতে হবে। ধন্যবাদ
জিম

7
@ ফ্যাব, ওভাররাইডিং connection:willCacheResponse:আপনাকে প্রতিক্রিয়াটিকে ক্যাশে সংরক্ষণ করতে দেয় না। NSURLRequestReloadIgnoringCacheDataনির্দিষ্ট করে যে সংযোগটি ক্যাশেটি পরীক্ষা না করেই অনুরোধটি লোড করা উচিত। পূর্ববর্তী সম্ভবত মেমরি বরাদ্দ পরিচালনা করতে সহায়তা করে manage
ক্রিস্টোফার পিক্সলে

12

আমি টুইটার থেকে তথ্য অনুরোধ করার সময় আমার অ্যাপ্লিকেশনটিতে একই সমস্যা রয়েছে। আমার ক্ষেত্রে আমার এই শংসাপত্রগুলি সংরক্ষণ করার দরকার ছিল না, তাই আমি পরবর্তী কোডটি ব্যবহার করে এগুলি মুছে ফেলি:

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

আমি আশা করি এটি কারও জন্য কাজ করে :)


এটি আমার সমস্যার এক নিখুঁত সমাধান ছিল, আমার পুনরায় সমস্যা ছিল, যেহেতু শংসাপত্রগুলি সংরক্ষণ করা হয়েছিল এবং স্বয়ংক্রিয়ভাবে এনএসআরএল সংযোগ দ্বারা জমা দেওয়া হয়েছিল, ধন্যবাদ এটি আমাকে বড় সময় সাহায্য করেছিল :)
আরভিএন

ধন্যবাদ এটি আমার জন্য কাজ, আমি আপনার পরামর্শ সত্যিই প্রশংসা করি। আসলে আমার সমস্যাটি হ'ল এনএসআরএলআপনি নাম এবং পাসওয়ার্ড সংরক্ষণের অনুরোধ করুন। সুতরাং ক্যাশে থেকে ব্যবহারকারীর শংসাপত্রগুলি অপসারণ করতে এই সহায়তা ...
নীলেশ কিকানী

10

আপনি যদি এনএসআরএল সংযোগ ব্যবহার করেন তবে প্রতিনিধিটির দিকে একবার নজর দিন:

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

ফেরত মূল্য

ক্যাশে সঞ্চয় করার জন্য প্রকৃত ক্যাশেড প্রতিক্রিয়া। প্রতিনিধি ক্যাশেড রেসপোনসকে অশোধিত পরিবর্তন করতে পারে, পরিবর্তিত ক্যাশেড প্রতিক্রিয়া ফিরিয়ে দিতে পারে, অথবা সংযোগের জন্য কোনও ক্যাশেড প্রতিক্রিয়া সংরক্ষণ না করা হলে শূন্যস্থান ফিরে আসতে পারে।


এখানে অনেক ধন্যবাদ। আমার অ্যাপটির মেমরির পদচিহ্ন হঠাৎ অর্ধেক হয়ে গেছে! নিক।
নিক কার্টরাইট

9

আপনি যদি ব্যবহার করছেন NSURLSession, Cache.dbআইওএস-এ লিখিত হওয়া অনুরোধ এবং পরামিতিগুলি রোধ করার জন্য আরও একটি সমাধান অ্যাপ্লিকেশনটির 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 টি যা আইওএসকে ডিস্কে লেখা বন্ধ করে দেয় তবে আপনার যদি নীতিমালা থাকে reloadIgnoringLocalCacheDataতবে আপনি সম্ভবত মেমরি ক্যাশে আগ্রহী নন।

দ্রষ্টব্য এটি কোনও Caches/Cache.db(অনুরোধ ও প্রতিক্রিয়া) বা Caches/fsCachedData/ফোল্ডার (প্রতিক্রিয়া ডেটা) তৈরি করা প্রতিরোধ করবে । আমরা সুরক্ষার জন্য একটি অ্যাপে এই পদ্ধতির সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নিয়েছি কারণ আমরা চাই না যে আমাদের অনুরোধগুলি কখনই ডিস্ক ক্যাশে সংরক্ষণ করা যায়।

যদি কারও জানা থাকে যে কেবল অনুরোধ করা ক্যাচিং বন্ধ করার উপায় আছে তবে আইওএস ইউআরএল লোডিং প্রক্রিয়া থেকে প্রতিক্রিয়া ডেটা ক্যাশে রাখুন, আমি জানতে আগ্রহী হব। (আমি যা বলতে পারি তার থেকে এ সম্পর্কে কোনও এপিআই বা অফিসিয়াল ডকুমেন্টেশন নেই)


7

যদি কোনও একক অনুরোধের সাথে সুনির্দিষ্ট না হয় (আপনি পুরো অ্যাপের জন্য ক্যাশে অক্ষম করতে চান) নীচের একটির সেরা বিকল্প।

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

7
আমার জন্য দুর্দান্ত কাজ করে তবে আপনি যে গুণটি 0-তে শেষ হয় কেবল তার গুণক না করে 0 ব্যবহার করতে পারেন।
গ্যারি রিচ

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

সার্ভারটি সঠিকভাবে প্রয়োগ করা হয়েছে বলে ধরে নিলে Cache-Control:no-storeঅনুরোধটিতে শিরোনাম স্থাপন করা একই শিরোলেখের সাথে একটি সার্ভার প্রতিক্রিয়া তৈরি করবে, ফলে NSURLCacheডিস্কে প্রতিক্রিয়া ডেটা সংরক্ষণ না করবে causing

অতএব, NSURLCacheডিস্ক ক্যাচিং অক্ষম করার শটগান পদ্ধতির প্রয়োজন নেই ।

PS: শিরোনাম যুক্ত করা সমস্ত HTTP ফ্রেমওয়ার্কের মতো কাজ করা উচিত AFNetworking

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.