RealmSwift и NSOutlineView падает, когда я удаляю строку - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь использовать 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

...