user6375148
user6375148

Reputation:

NSCache() is not working properly

I think I am tired of NSCache(). Could not understand what's the problem behind this. Trying to save an array of [AnyObject] to NSCahce(), which I have done using this following line of code.

NSCache().setObject(data, forKey: "News")

And tried to get it back using this way.

     if let news = NSCache()("News") as? [AnyObject]
     {
     }
     else 
     {
       // I am always here :)
     }

So I was thinking what's the problem with this. After searching a bit in Google I could see that setting totalCostLimit and countLimit will help you solve this problem. So I have set it like this.

NSCache().totalCostLimit = 50000
NSCache().countLimit = 50000

After setting this also, it was not working. So I thought of running this code in main thread, which I have done like this.

        dispatch_async(dispatch_get_main_queue()) {
          NSCache().setObject(data, forKey: "News")
        }

Still it returned nil. Now last but not the least I have created one global instance of NSCache() and called all these operations using that instance. Well, doing like that also didn't give the expected result. It always gave me nil.

What's happening here? I know that NSCache() can store AnyObject values. I am saving lot of images in the same project without any problem, when I am trying to save this it returns nil.

Well this AnyObject contains some custom classes. Is that can be a problem? If yes, how will I save it locally without using CoreData or NSUserdefaults.

How I created an instance globally and accessed these. Created one instance of NSCache in the AppDelegate.swift file but outside of AppDelegate class

 let mainCache = NSCache()

    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate {

      func applicationDidFinishLaunching(aNotification: NSNotification)
      {
        mainCache.totalCostLimit = 50000
        mainCache.countLimit = 50000
      }
    }

Later I have used it like this.

mainCache.setObject(data, forKey: "News")

And getting the data back like this.

 if let news = mainCache.objectForKey("News") as? [AnyObject]
 {

 }
else
 {
         // Always here :)           
 }

Upvotes: 0

Views: 497

Answers (1)

jtbandes
jtbandes

Reputation: 118731

When you write NSCache() you are creating a new NSCache instance. You're doing this on just about every line.

What you need to do is create one instance, let myCache = NSCache(), and then reuse it: myCache.setObject(data, forKey: "News").

Upvotes: 1

Related Questions