💽

Realmインスタンスのキャッシュは2段階

2025/02/14に公開

Realmインスタンスのキャッシュは2段階でキーをつくってRealmインスタンスをstaticに保存しているっぽい。

https://github.com/realm/realm-swift/blob/v20.0.1/Realm/RLMRealmUtil.mm#L40-L52

当然、Realmをインスタンス化する際にRealmをキャッシュから取り出せる。

https://github.com/realm/realm-swift/blob/v20.0.1/Realm/RLMRealm.mm#L365-L371

つまり、データ自体はファイルにあり、それにアクセスしてくるRealmインスタンスごとにキャッシュを持っている。

想像上の構造としては次の通り。

s_realmsPerPath = {
    "/path/to/realm1.realm" => {
        thread1 => realmInstance1,
        thread2 => realmInstance2
    },
    "/path/to/realm2.realm" => {
        thread1 => realmInstance3,
        thread2 => realmInstance4
    }
}

何が言いたいかというと、同じデータのRealmにあくせすしてもスレッドごとにインスタンスは別物である。

インスタンスが別だと何が困るの?

Realmはインスタンスごとにデータを分岐している。具体的にはメインスレッドで作成したRealmのデータから別スレッド用にデータを分岐し、それをメインにマージする。

そのタイミングによってはメインスレッドで書き込まれたデータが、別スレッドには存在しないということがある。

cahceを使いたくない

configurationでcacheをfalseにしたらいい(dynamicもfalse)。

https://github.com/realm/realm-swift/blob/v20.0.1/Realm/RLMRealm.mm#L167-L172

Discussion