Я добавляю дополнительный ответ, который в некоторой степени связан с первым, но также стоит сам по себе.
В двух словах, как только Realm подключится к источнику данных, он будет продолжать использовать этот источник данных до тех пор, покапоскольку объекты не освобождаются, даже если фактический файл удален.
Способ заключается в том, чтобы инкапсулировать вызовы Realm в пул автоматического выпуска, чтобы эти объекты могли быть освобождены при удалении Realm.
Вот пример:
Эта функция добавляет объект GameData в файл default.realm.
func addAnObject() {
autoreleasepool {
let realm = try! Realm()
let testData = GameData()
testData.Scenario = "This is my scenario"
testData.Id = 1
try! realm.write {
realm.add(testData)
}
}
}
В этот момент, если вы запустите код addAnObject, ваш файл будетесть объект GameData.
GameData {
Id = 1;
GameDate = (null);
Scenario = This is my scenario;
GameStarted = 0;
}
Затем функция, которая удаляет старую область и копирует связанную область на ее место. Это работает, потому что все взаимодействие с Realm было заключено в пул автоматического выпуска, поэтому объекты могут быть освобождены.
func createDefaultRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let defaultParentURL = defaultURL.deletingLastPathComponent()
if let bundledRealmURL = self.bundleURL("default") {
do {
try FileManager.default.removeItem(at: defaultURL)
try FileManager.default.copyItem(at: bundledRealmURL, to: defaultURL)
} catch let error as NSError {
print(error.localizedDescription)
return
}
}
let migrationBlock : MigrationBlock = { migration, oldSchemaVersion in
//handle migration
}
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 18, migrationBlock: migrationBlock)
print("Your default realm objects: \(try! Realm().objects(GameData.self))")
}
func bundleURL(_ name: String) -> URL? {
return Bundle.main.url(forResource: name, withExtension: "realm")
}
и обратите внимание, что если вы обращаетесь к Realm внутри класса, но снаружи пул авто-релизов, Realm откажется «отпускать» свои объекты.
НЕ делайте этого !!
class ViewController: UIViewController {
var realm = try! Realm()