2016-05-31 28 views
0

Ich denke, ich bin müde von . Konnte nicht verstehen, was das Problem dahinter ist. Versuch, ein Array von [AnyObject] zu NSCahce() zu speichern, die ich mit dieser folgenden Codezeile gemacht habe.NSCache() funktioniert nicht richtig

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

Und versucht, es auf diese Weise zurück zu bekommen.

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

Also dachte ich, was ist das Problem mit diesem. Nach ein wenig Suchen in Google konnte ich sehen, dass die Einstellung totalCostLimit und countLimit Ihnen helfen wird, dieses Problem zu lösen. Also habe ich es so eingestellt.

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

Nachdem dies auch eingestellt wurde, funktionierte es nicht. Also dachte ich daran, diesen Code im Hauptthread auszuführen, was ich so gemacht habe.

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

Immer noch zurück nil. Jetzt last but not least habe ich eine globale Instanz von NSCache() erstellt und alle diese Operationen mit dieser Instanz aufgerufen. Nun, das hat auch nicht das erwartete Ergebnis gebracht. Es gab mir immer nil.

Was passiert hier? Ich weiß, dass NSCache()AnyObject Werte speichern kann. Ich speichere viele Bilder im selben Projekt ohne Probleme, wenn ich versuche, das zu speichern, gibt es nil zurück.

Nun, diese AnyObject enthält einige benutzerdefinierte Klassen. Kann das ein Problem sein? Wenn ja, wie speichere ich es lokal, ohne CoreData oder NSUserdefaults zu verwenden.

Wie ich eine Instanz global erstellt und auf diese zugegriffen habe. Erstellte Datei eine Instanz nscache im AppDelegate.swift aber außerhalb AppDelegate Klasse

let mainCache = NSCache() 

    @NSApplicationMain 
    class AppDelegate: NSObject, NSApplicationDelegate { 

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

Später habe ich es wie folgt verwendet.

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

Und erhalten Sie die Daten zurück wie folgt.

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

} 
else 
{ 
     // Always here :)   
} 
+0

Erstellt das nicht nur temporäre 'NSCache'-Instanzen und zerstört sie dann sofort? Verwenden Sie eine Instanzvariable, vielleicht? – trojanfoe

Antwort

1

Wenn Sie NSCache() schreiben Sie sind eine neue nscache Instanz. Du machst das auf fast jeder Zeile.

Sie müssen eine Instanz erstellen, let myCache = NSCache(), und dann wiederverwenden: myCache.setObject(data, forKey: "News").

+0

Ich habe eine globale Instanz erstellt und versucht, aber es hat nicht funktioniert –

+0

@AlvinVarghese Zeigen Sie diesen Code in Ihrer Frage. – trojanfoe

+0

Werden die NSCache-Daten entfernt, wenn ich jedes Mal die Mac-App ausführe? –