2016-05-31 17 views
0

私はNSCache()が疲れていると思います。これの背後にある問題は何であるか理解できませんでした。 [AnyObject]NSCahce()の配列を保存しようとしていますが、これは次のコード行を使って行っています。NSCache()が正常に動作していません

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

そして、この方法でそれを取り戻そうとしました。

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

私はこれに問題があると考えていました。 Googleのビットを検索した後、私はこの設定をtotalCostLimitcountLimitに設定することでこの問題を解決することができます。だから私はこれをこのように設定しました。

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

これを設定しても機能しませんでした。だから私はメインスレッドでこのコードを実行することを考えました。私はこのようにしました。

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

なお、nilを返しました。最後に、NSCache()のグローバルインスタンスを1つ作成し、そのインスタンスを使用してこれらの操作をすべて呼び出しました。まあ、そのようにしても期待された結果は得られませんでした。それはいつも私にnilを与えました。

ここには何が起こっていますか?私はNSCache()AnyObject値を格納できることを知っています。同じプロジェクトに多くの画像を保存していますが、これを保存しようとするとnilが返されます。

よくこのAnyObjectにはいくつかのカスタムクラスが含まれています。それが問題になることはありますか?はいの場合は、CoreDataまたはNSUserdefaultsを使用せずにローカルに保存する方法を教えてください。

どのようにインスタンスをグローバルに作成し、これらにアクセスしましたか。 AppDelegate.swiftファイルにNSCacheの1つのインスタンスを作成したが、AppDelegateクラスの外

let mainCache = NSCache() 

    @NSApplicationMain 
    class AppDelegate: NSObject, NSApplicationDelegate { 

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

後、私はこのようにそれを使用しています。

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

このようにデータを戻すと、

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

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

一時的な 'NSCache'インスタンスを作成してすぐに破棄しないのですか?おそらく、インスタンス変数を使用しますか? – trojanfoe

答えて

1

あなたがNSCache()を書くとき、あなたが新しいNSCacheインスタンスを作成あります。あなたは、ほぼすべての行でこれをやっています。

あなたが行う必要があるのは、1つのインスタンスlet myCache = NSCache()を作成し、それを再利用する:myCache.setObject(data, forKey: "News")です。

+0

グローバルインスタンスを1つ作成して試しましたが、動作しませんでした。 –

+0

@AlvinVarghese質問にそのコードを表示してください。 – trojanfoe

+0

毎回Macアプリを実行すると、NSCacheのデータが削除されますか? –

関連する問題