Я пытаюсь использовать NSOutlineView с объектами Realm, но не могу найти обходной путь для удаления объектов. Кажется, что независимо от того, что я пытаюсь, OutlineView пытается получить доступ к объекту области при удалении, что вызывает исключение области.
Ожидаемые результаты
Я ожидал бы, что смогу удалить объект области и затем вызвать обновление NSOutlineView, вызвав reloadData () без исключения
Фактические результаты
См. Трассировку стека ниже - мне не совсем понятно, почему reloadData () вылетает, если объект был удален из источника данных, но похоже, что outlineView пытается каким-то образом получить доступ к объекту во время очистки старые данные.
2019-06-07 19:46:40.548426+1000 MM[8485:1624551] [General] Object has been deleted or invalidated.
2019-06-07 19:46:40.554541+1000 MM[8485:1624551] [General] (
0 CoreFoundation 0x00007fff52c21cfd __exceptionPreprocess + 256
1 libobjc.A.dylib 0x00007fff7d2c8a17 objc_exception_throw + 48
2 Realm 0x00000001012d499c ___ZN12_GLOBAL__N_115makeBoxedGetterIN5realm10StringDataEEEP11objc_objectm_block_invoke + 285
3 Foundation 0x00007fff54dd98c5 -[NSObject(NSKeyValueCoding) valueForKey:] + 281
4 Realm 0x00000001012ef898 -[RLMObjectBase valueForKey:] + 85
5 Realm 0x00000001012f0b44 -[RLMObjectBase hash] + 145
6 Foundation 0x00007fff54dc2176 probeGC + 79
7 Foundation 0x00007fff54e0d829 -[NSConcreteMapTable removeObjectForKey:] + 53
8 AppKit 0x00007fff504486e9 _NSOVFreeRowEntry + 59
9 AppKit 0x00007fff5044864f _NSOVRecursiveFreeChildrenAndItem + 121
10 AppKit 0x00007fff5043c9a6 _NSOVFastRemoveChildRowEntries + 216
11 AppKit 0x00007fff5043c882 -[NSOutlineView reloadData] + 564
Шаги для воспроизведения
Кажется, я не могу воспроизвести это в тестовом приложении.
Пример кода
realm.beginWrite()
realm.delete(item)
do {
try realm.commitWrite()
self.outlineView?.reloadData()
} catch {
}
Может ли кто-нибудь пролить свет на то, что может происходить, посмотрев на трассировку стека выше. Возможно ли, что NSOutlineView пытается получить доступ к удаленному объекту во время вызова reloadData ()? Даже если я вручную удаляю объект из массива источника данных, я получаю тот же сбой, и это происходит до вызова любого из методов источника данных.
Если я использую класс-обертку для хранения объекта Realm или если я использую свойство объекта (isDeleted), чтобы пометить объект как удаленный, то проблема исчезнет. Преимущество последнего подхода заключается в том, что результаты обновляются автоматически.
Вот ссылка на репозиторий.
https://github.com/duncangroenewald/ReamSwift-NSOutlineView-EXC_BAD_ACCESS.git