এনএসকেচে কীভাবে ব্যবহার করবেন


121

NSCacheস্ট্রিং ক্যাশে ব্যবহার করার জন্য কীভাবে কেউ উদাহরণ দিতে পারেন ? বা কারও ভালো ব্যাখ্যার লিঙ্ক আছে? আমি কোন সন্ধান করতে পারে না ..


7
প্রচুর পরিমাণে কোকো দেখা সত্ত্বেও আমি কখনও এনএসকেচে শুনিনি। ভাল প্রশ্ন!
Nektarios

আমি এখানে এনএসকেচের একটি পুনরাবৃত্ত সংস্করণ তৈরি করেছি। এতে অবদান রাখতে নির্দ্বিধায়: 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
কীভাবে এনএসকেচে অবজেক্ট ইনস্ট্যান্ট করবেন? আমি যখনই অ্যাপটি চালাচ্ছি তখন সমস্ত ক্যাশেড তথ্য আমি আলগা করে দেখছি। আমি ব্যবহার করি; [[এনএসকেচে বরাদ্দ] থিম]
থিজার

17
এটি ডিস্কে স্থায়ী ক্যাশে নয়। এটি কেবল স্মৃতিতে রয়েছে, তাই হ্যাঁ, আপনার অ্যাপ্লিকেশন চলমান বন্ধ হয়ে গেলে এটি ধ্বংস হয়ে যায়।
জোনাথন গ্রিনস্পান

অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে প্রবেশের পরে কি এই ক্যাশেটি বজায় রাখা হয়? (অর্থাত্ পরে applicationDidEnterBackground)
বারফুন

যদি অ্যাপ্লিকেশনটি সমাপ্ত না হয় এবং NSCacheঅবজেক্টটি deallocated না হয়, তবে হ্যাঁ, এটি স্মৃতিতে থাকবে। এর বিষয়বস্তু এখনও culling সাপেক্ষে হতে পারে।
জোনাথন গ্রিনস্পান

3
না। একটি প্রতিস্থাপন দৃ .়ভাবে দাবি করে যে কিছু সত্য, অর্থাত্ যে বিবৃতিটি সত্যই প্রত্যাশিত। আমরা দৃser়ভাবে বলছি যে অবজেক্ট অ্যাসাইনমেন্ট এবং / অথবা সৃষ্টি সফল হয়েছিল।
জোনাথন গ্রিনস্পান

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
হ্যাঁ. সংরক্ষণ করুন: [চিত্রসমূহ অভিধান সেটঅবজেক্ট: চিত্র ডেটা ফরকি: @ "কেই"]; পুনরুদ্ধার করুন: এনএসডাটা * ছবিডাটা = [চিত্রসমূহের ক্যাশে অব্ফোরকি: @ "কেই"];
গ্যাব্রিয়েল.মাসানা

2
চাচে ডেটা সংরক্ষণ করুন: [চিত্রসামগ্রী ক্যাচ সেটঅবজেক্ট: চিত্র ডেটা ফরকি: @ "কেই"];
কাস-কাদ

1
আমি কেবল পোস্টটি সম্পাদনা করেছি পরিবর্তিত: চিত্রসামগ্রী ক্যাশের জন্য চিত্রসমূহক ictionary ধন্যবা
Gabriel.Massana

একটি সমমানের দ্রুত উদাহরণ?
জ্যাস্পার

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

পুনরুদ্ধার করা

গুরুত্বপূর্ণ: এনএসকেচে শ্রেণিতে বিভিন্ন অটো-অপসারণের নীতি অন্তর্ভুক্ত করা হয়েছে। আপনি যদি স্থায়ীভাবে ডেটা ক্যাশে করতে চান বা নির্দিষ্ট সময়ে ক্যাশে ডেটা সরাতে চান তবে এই উত্তরটি দেখুন


1

ক্যাশেড অবজেক্টগুলি কি এনএসডিসকারেবল কনটেন্ট প্রোটোকলটি প্রয়োগ করা উচিত নয়?

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


1
আপনি এনএসডিসকারেবল কনটেন্ট প্রোটোকলটি প্রয়োগ করতে পারেন তবে এটির প্রয়োজন নেই। যেহেতু মনে হয় এনএসডিসিকারযোগ্য কনটেন্টটি এনএসচে থেকে সর্বদা সরানো হবে যখন কোনও রেফারেন্স নেই। 'স্মৃতিশক্তি শক্ত না হওয়া' এবং এনএসকেচে সাফ হয়ে যাওয়া অবধি এনএসডিসকারেবল কনটেন্ট অবজেক্ট ছাড়া অন্য অবজেক্টগুলি এনএসকেচে সঞ্চিত থাকে।
থিজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.