删除行时RealmSwift和NSOutlineView崩溃

时间:2019-06-07 12:53:57

标签: swift realm nsoutlineview

我正在尝试将NSOutlineView与Realm对象一起使用,但似乎找不到删除对象的解决方法。无论我尝试什么,OutlineView似乎都尝试在删除它时尝试访问领域对象,这会引发领域异常。

预期结果

我希望能够删除领域对象,然后通过调用reloadData()触发对NSOutlineView的更新,而不会引发异常

实际结果

请参阅下面的堆栈跟踪信息-我真的不清楚为什么给定对象已从数据源中删除,而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

0 个答案:

没有答案