質問: response{ print("download \(metadata)") }else{ print(error) } }) } } ``` 一度アプリを閉じてからビルドすると復元した新しいdefault.realmが反映されます。 どうすれば、realmファイルのコピー、リネームが完了した流れで、新しいファイルを反映することができるのでしょうか。よろしくお願いします。
回答: 同じファイル名のRealmファイルを上書きして、実行中に切り替えるには、ファイルを上書きする前に、全てのスレッドで、そのファイルを参照するRealmインスタンスが全て解放されている必要があります。 そうでなければ、以前のRealmファイルのデータがメモリやキャッシュに残っているので、書かれたような現象、アプリを再起動するとファイルが切り替わる(ように見える)が起こります。 やりたいことを実現する簡単な方法は別のファイル名にして切り替えることです。 (全てのスレッドでRealmの参照が解放されていることを保証するのは難しいので) 例えば、未ログイン時のデータを「local.realm」、サーバ(DropBox)からダウンロードしたデータを「server.realm」とし、2つをマージしたデータを「merged.realm」とします。 そうすると、未ログイン時は「local.realm」を使い、ログイン後に「server.realm」をダウンロード、データをどちらかにマージして、「merged.realm」としてコピー。 その後、「merged.realm」を新しく読み込む、とすれば簡単にデータの移行ができます。 もし、同じファイル名でやりたい場合は、切り替えの間は別スレッドでRealmを使わないようにして、切り替える前と後でRealmのインスタンスを`autoreleasepool`ブロックで囲い、それぞれのRealmインスタンスが解放されるようにします。 ``` autoreleasepool { let realm = try! Realm() // データをマージ // ファイル名を変更など } autoreleasepool { // 新しいファイルを読み込む let realm = try! Realm() } ```