モケラ

Tech Sheets

mokelab

NSCacheを容量制限して使ってみる

最終更新日:2016-09-18

画像のような、オブジェクトによってサイズがまちまちなものをキャッシュに入れる場合、サイズの総量を一定値以下にするといった工夫が必要になります。NSCacheではtotalCostLimitで上限を決め、セット時にcostを指定します。

class User {
    var name : String
    init(name : String) {
        self.name = name
    }
}

let cache = NSCache<NSNumber, User>()
cache.totalCostLimit = 5
cache.setObject(User(name : "moke1"), forKey: 1, cost: 1)
cache.setObject(User(name : "moke2"), forKey: 2, cost: 2)
// この時点での容量は3/5、
cache.setObject(User(name : "moke3"), forKey: 3, cost: 3)

let user1 = cache.object(forKey: 1)
print(user1?.name)
let user2 = cache.object(forKey: 2)
print(user2?.name)
let user3 = cache.object(forKey: 3)
print(user3?.name)

結果は次のようになります。

nil
moke2
moke3

totalCostLimitを指定し、セット時にコストを指定しなかった場合はコスト0として扱われます。また、容量オーバーとなる場合は古い順に消されます。例えばtotalCostLimit=25で、次のような操作をしたとします。

  1. コスト20をいれる
  2. コスト3をいれる
  3. コスト5をいれる←容量オーバー

この場合、コスト3とコスト5が残ります。

一覧に戻る