Я создаю объект, который хранит List<Int>
(который Realm теперь обрабатывает в версии 3+), и я хочу иметь возможность быстрого поиска, поэтому я также сохраняю словарь типа [Int: Int]
, заполненный как Я добавляю предметы в список.
Царство, очевидно, не может хранить словарь, но оно может хранить Список. Этот шаблон прекрасно работает, когда я использую его в своем основном объекте, но когда я помещаю его в объект, на который ссылается основной объект Top, словарь продолжает сбрасываться на пустой. Чтобы проверить это, я создал простой проект, который имеет только один View Controller, и единственное, что он делает, это создает область, создает главный объект, добавляет некоторые элементы в список в подобъекте и распечатывает результат. (все в методе viewDidLoad).
Пример кода, который демонстрирует проблему:
@objcMembers class Top: Object {
dynamic var id = UUID().uuidString
dynamic var inside: Inside? = Inside()
func addInside(_ value: Int) {
inside?.add(value)
}
}
@objcMembers class Inside: Object {
var name = UUID().uuidString
dynamic var list = List<Int>()
var dictionary = [Int: Int]()
override static func ignoredProperties() -> [String] { return ["dictionary", "name"] }
func add(_ value: Int) {
list.append(value)
dictionary[value] = value
print("Name: \(name); Dictionary: \(dictionary); List: \(list)")
}
}
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
try! realm.write {
realm.deleteAll()
}
let topObj = Top()
try! realm.write {
realm.add(topObj)
topObj.addInside(12)
topObj.addInside(32)
topObj.addInside(42)
}
}
Вывод этого в консоли показывает:
Name: 977DBC69-BEAA-4F33-BB38-60643DFEA72D; Dictionary: [12: 12]; List: List<int> <0x604000102f40> (
[0] 12
)
Name: 4EB8F28E-0401-4CB7-9E77-A9F769EFAC64; Dictionary: [32: 32]; List: List<int> <0x600000103f90> (
[0] 12,
[1] 32
)
Name: 453608E0-2DEA-4D43-AF73-929137D8E16A; Dictionary: [42: 42]; List: List<int> <0x600000104020> (
[0] 12,
[1] 32,
[2] 42
)
Я добавил строку UUID в класс Inside и сделал ее неуправляемым свойством, чтобы посмотреть, не является ли это просто проблемой в Dictionary; но у обоих есть проблемы. Этот пример показывает, что Realm создает новый экземпляр объекта каждый раз, когда я вызываю для него метод - хотя я ожидаю, что объект останется в памяти, потому что я все еще ссылаюсь на объект Top, который его держит.
Существует ли конфигурация, которая скажет Realm прекратить создание новых экземпляров подобъекта в этих простых случаях? Если бы я перезагрузил исходный объект Top из базы данных, я бы ожидал потерять эти игнорируемые свойства, но это просто не имеет смысла для меня. Что еще мне не хватает? Спасибо за помощь.