NSCache का उपयोग कैसे करें


121

क्या कोई उदाहरण दे सकता है कि कैसे NSCacheएक स्ट्रिंग को कैश करने के लिए उपयोग करें? या किसी के पास एक अच्छी व्याख्या का लिंक है? मैं किसी भी खोजने के लिए प्रतीत नहीं कर सकते ..


7
कोको की एक बड़ी मात्रा को देखने के बावजूद मैंने NSCache के बारे में कभी नहीं सुना। अच्छा प्रश्न!
Nektarios

मैंने यहाँ NSCache का एक चलने योग्य संस्करण बनाया। इसे योगदान करने के लिए स्वतंत्र महसूस करें: github.com/gregkrsak/GKCache
ग्रेग एम। क्रैस्क

जवाबों:


134

आप इसका उपयोग उसी तरह से करेंगे जैसे आप करते हैं NSMutableDictionary। अंतर यह है कि जब NSCacheअत्यधिक मेमोरी दबाव का पता चलता है (यानी यह बहुत अधिक मूल्यों को कैशिंग करता है) तो यह उन कुछ मूल्यों को कमरे बनाने के लिए जारी करेगा।

यदि आप रनटाइम पर उन मूल्यों को फिर से बना सकते हैं (इंटरनेट से डाउनलोड करके, गणना करके, जो भी हो) तो NSCacheआपकी आवश्यकताओं के अनुरूप हो सकता है। यदि डेटा को फिर से बनाया नहीं जा सकता है (जैसे यह उपयोगकर्ता इनपुट है, यह समय-संवेदनशील है, आदि) तो आपको इसे स्टोर नहीं करना चाहिए NSCacheक्योंकि यह वहां नष्ट हो जाएगा।

उदाहरण के लिए, थ्रेड सुरक्षा को ध्यान में नहीं रखना:

// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");

// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
    // It's not in the cache yet, or has been removed. We have to
    // create it. Presumably, creation is an expensive operation,
    // which is why we cache the results. If creation is cheap, we
    // probably don't need to bother caching it. That's a design
    // decision you'll have to make yourself.
    myWidget = [[[Widget alloc] initExpensively] autorelease];

    // Put it in the cache. It will stay there as long as the OS
    // has room for it. It may be removed at any time, however,
    // at which point we'll have to create it again on next use.
    [myCache setObject: myWidget forKey: @"Important Widget"];
}

// myWidget should exist now either way. Use it here.
if (myWidget) {
    [myWidget runOrWhatever];
}

1
NSCache ऑब्जेक्ट को तुरंत कैसे करें? मैं हर बार कैश्ड जानकारी को ढीला कर देता हूं जब भी मैं ऐप चलाता हूं। मैं उपयोग करता हूं; [[NSCache आबंटित] init]
थिज़र

17
यह डिस्क पर स्थायी कैश नहीं है। यह केवल स्मृति में है, इसलिए हाँ, यह तब नष्ट हो जाता है जब आपका ऐप चलना बंद हो जाता है।
जोनाथन ग्रिप्सन

क्या इस कैश को तब रखा जाता है जब एप्लिकेशन बैकग्राउंड में प्रवेश करता है? (बाद में applicationDidEnterBackground)
बारफून

यदि आवेदन को समाप्त नहीं किया गया है और NSCacheवस्तु को समाप्त नहीं किया गया है, तो हाँ, यह स्मृति में रहेगा। इसकी सामग्री हालांकि अभी भी कुल्लिंग के अधीन हो सकती है।
जोनाथन ग्रिप्सन 19

3
नहीं। इस बात का दावा किया जाता है कि कुछ सच है, अर्थात यह कथन सही होने की उम्मीद है। हम दावा कर रहे हैं कि ऑब्जेक्ट असाइनमेंट और / या निर्माण सफल रहा।
जोनाथन ग्रियर्सन

19
@implementation ViewController
{    
    NSCache *imagesCache;    
}


- (void)viewDidLoad
{    
    imagesCache = [[NSCache alloc] init];
}


// How to save and retrieve NSData into NSCache
NSData *imageData = [imagesCache objectForKey:@"KEY"];
[imagesCache setObject:imageData forKey:@"KEY"];

3
हाँ। सहेजें: [images सहभाजक सेट करें: imageData forKey: @ "कुंजी"]; पुनः प्राप्त करें: NSData * imageData = [imagesCache objectForKey: @ "KEY"];
गैब्रियल.मैसना

2
चचे को डेटा सहेजें: [imagesCache setObject: imageData forKey: @ "KEY"];
कास-काद

1
मैंने अभी-अभी पोस्ट को परिवर्तित किया है: imagesCache। Thx
गेब्रियल.मैसना

एक समान तेज उदाहरण?
जैस्पर

9

स्विफ्ट में NSCache का उपयोग करके स्ट्रिंग को कैशिंग करने के लिए नमूना कोड:

var cache = NSCache()
cache.setObject("String for key 1", forKey: "Key1")
var result = cache.objectForKey("Key1") as String
println(result) // Prints "String for key 1"

NSCache (एक सिंगलटन) का एक एकल ऐप-व्यापी उदाहरण बनाने के लिए, आप आसानी से NSCache का विस्तार करके एक साझा संपत्ति जोड़ सकते हैं। बस NSCache + Singleton.swift नामक फाइल में निम्नलिखित कोड डालें:

import Foundation

extension NSCache {
    class var sharedInstance : NSCache {
        struct Static {
            static let instance : NSCache = NSCache()
        }
        return Static.instance
    }
}

आप एप्लिकेशन में कहीं भी कैश का उपयोग कर सकते हैं:

NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"

3
क्या आप जानते हैं कि इसे स्विफ्ट 3 में कैसे लागू किया जाए?
एंडी

3
यह काम करना चाहिए: class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
अमिताभ १४'१६

6

नमूना परियोजना अपनी परियोजना के लिए नमूना परियोजना से CacheController.h और .m फ़ाइल जोड़ें। कक्षा में जहां आप डेटा को कैश करना चाहते हैं, नीचे दिए गए कोड को डालें।

[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];

आप इसका उपयोग करके कोई भी वस्तु सेट कर सकते हैं

[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];

पीछे हटना

महत्वपूर्ण: NSCache वर्ग में विभिन्न ऑटो-रिमूवल नीतियां शामिल हैं। यदि आप स्थायी रूप से डेटा को कैश करना चाहते हैं या आप एक विशिष्ट समय में कैश्ड डेटा को निकालना चाहते हैं, तो इस उत्तर को देखें


1

कैशेड ऑब्जेक्ट्स को NSDiscardableContent प्रोटोकॉल को लागू नहीं करना चाहिए?

NSCache वर्ग के संदर्भ से: NSCache ऑब्जेक्ट्स में संग्रहीत एक सामान्य डेटा प्रकार एक ऑब्जेक्ट है जो NSDiscardableContent प्रोटोकॉल को लागू करता है। इस प्रकार की वस्तु को कैश में संग्रहीत करने से लाभ होता है, क्योंकि इसकी सामग्री को तब छोड़ा जा सकता है जब इसकी आवश्यकता नहीं होती है, इस प्रकार यह मेमोरी को बचाता है। डिफ़ॉल्ट रूप से, कैश में NSDiscardableContent ऑब्जेक्ट स्वचालित रूप से कैश से हटा दिए जाते हैं यदि उनकी सामग्री को छोड़ दिया जाता है, हालांकि इस स्वचालित हटाने नीति को बदला जा सकता है। यदि NSDiscardableContent ऑब्जेक्ट कैश में डाल दिया जाता है, तो कैश उसे हटाने पर उस परContentIfPossible को कॉल करता है।


1
आप NSDiscardableContent प्रोटोकॉल को लागू कर सकते हैं लेकिन इसकी आवश्यकता नहीं है। जैसा कि लगता है NSDiscardableContent को हमेशा NSCache से हटा दिया जाता है जब कोई और संदर्भ नहीं होता है। NSDiscardableContent ऑब्जेक्ट के अलावा अन्य वस्तुओं को NSCache में तब तक स्टोर किया जाता है जब तक कि 'मेमोरी टाइट न हो जाए' और NSCache क्लियर हो जाए।
थिज़र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.