领域、对象已被删除或失效

Mar*_*tyn 2 realm ios swift rx-swift

我正在尝试构建一个新的 iOS 应用程序,并使用 RxSwift 库和领域作为数据库。

我构建了一个表格视图,其中显示领域中的对象列表,这些对象应该是可编辑的并且可以删除。(我不使用表格视图编辑功能。)

现在,当我从表中删除一个项目时,表应该刷新,因为我使用 RxSwift 将 tableview 绑定到 Realm 结果。但它不但没有更新,反而使应用程序崩溃。

应用程序崩溃时出现的错误是'RLMException', reason: 'Object has been deleted or invalidated.' 我在输出中得到了堆栈跟踪,但我找不到崩溃发生的来源/原因。

输出堆栈跟踪:

2018-05-14 00:09:34.660634+0200 RealmTest[65540:4239839] *** Terminating app due to uncaught exception 'RLMException', reason: 'Object has been deleted or invalidated.'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f76e1e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x000000010ee03031 objc_exception_throw + 48
    2   Realm                               0x000000010d44abd3 _ZL17RLMVerifyAttachedP13RLMObjectBase + 83
    3   Realm                               0x000000010d44c89c _ZN12_GLOBAL__N_18getBoxedIN5realm10StringDataEEEP11objc_objectP13RLMObjectBasem + 28
    4   Realm                               0x000000010d44c877 ___ZN12_GLOBAL__N_115makeBoxedGetterIN5realm10StringDataEEEP11objc_objectm_block_invoke + 39
    5   RealmTest                           0x000000010cf9c6a9 _T09RealmTest0B9ModelItemV8identitySSvg + 41
    6   RealmTest                           0x000000010cf9c6f5 _T09RealmTest0B9ModelItemV14Differentiator16IdentifiableTypeAadEP8identity8IdentityQzvgTW + 21
    7   Differentiator                      0x000000010d29f24e _T014Differentiator4DiffO23calculateAssociatedData33_D199D3FBF4B7CA3AFA95223EE09B4772LLs15ContiguousArrayVyAGyAC04ItemdE0AELLVGG_AKtAGyAGyxGG07initialP5Cache_AM05finalpR0tKAA16IdentifiableTypeRzlFZ + 2094
    8   Differentiator                      0x000000010d2ac30e _T014Differentiator4DiffO16CommandGenerator33_D199D3FBF4B7CA3AFA95223EE09B4772LLV22calculateItemMovementss15ContiguousArrayVyAIyAC0N14AssociatedDataAELLVGG_AMtAIyAIy0N0QzGG07initialN5Cache_AQ05finalnU0AIyAC07SectionrS0AELLVG0twS0AV0vwS0tKFZ + 334
    9   Differentiator                      0x000000010d2a1d65 _T014Differentiator4DiffO16CommandGenerator33_D199D3FBF4B7CA3AFA95223EE09B4772LLV27generatorForInitialSectionsAFy_xGSayxG_AI05finalP0tKFZ + 1253
    10  Differentiator                      0x000000010d2a1395 _T014Differentiator4DiffO27differencesForSectionedViewSayAA9ChangesetVyxGGSayxG15initialSections_AI05finalI0tKAA26AnimatableSectionModelTypeRzlFZ + 277
    11  RxDataSources                       0x000000010e35ede4 _T013RxDataSources0a26TableViewSectionedAnimatedB6SourceC05tableE0ySo07UITableE0C_0A5Swift5EventOySayxGG08observedL0tFyACyxG_AJtcfU_yycfU_ + 660
    12  RxDataSources                       0x000000010e360049 _T013RxDataSources0a26TableViewSectionedAnimatedB6SourceC05tableE0ySo07UITableE0C_0A5Swift5EventOySayxGG08observedL0tFyACyxG_AJtcfU_yycfU_TA + 25
    13  RxDataSources                       0x000000010e35f63d _T0Ieg_IeyB_TR + 45
    14  libdispatch.dylib                   0x0000000113b5b807 _dispatch_call_block_and_release + 12
    15  libdispatch.dylib                   0x0000000113b5c848 _dispatch_client_callout + 8
    16  libdispatch.dylib                   0x0000000113b6792b _dispatch_main_queue_callback_4CF + 628
    17  CoreFoundation                      0x000000010f730c99 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    18  CoreFoundation                      0x000000010f6f4ea6 __CFRunLoopRun + 2342
    19  CoreFoundation                      0x000000010f6f430b CFRunLoopRunSpecific + 635
    20  GraphicsServices                    0x0000000117bb5a73 GSEventRunModal + 62
    21  UIKit                               0x000000010fbeb0b7 UIApplicationMain + 159
    22  RealmTest                           0x000000010cf9a0a7 main + 55
    23  libdyld.dylib                       0x0000000113bd9955 start + 1
    24  ???                                 0x0000000000000001 0x0 + 1
)
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有人知道我做错了什么,并且删除领域对象的正确方法是使用 RxSwift 和数据绑定?

编辑:

我做了一个小测试项目并将其放在我的 github 上,当您点击“deleteFirst”按钮时会出错。https://github.com/Hiiragisan09/ios-example-project-realm-test

应用程序崩溃的屏幕截图

Mar*_*tyn 5

我自己找到了解决方案。

当我开始使用 Realm 时,我不知道如果删除对象,对象就会发生变化。

这有点困难,因为当领域因“领域对象已被删除或失效”而崩溃时,它不会提供您尝试访问领域对象的属性的堆栈跟踪。

因此,当您从 Realm 中删除项目时,它将触发表获取新项目,并且由于表是动画的,因此它将尝试将新数据与旧数据进行比较。当 Diff 尝试访问旧数据中的属性时,它会崩溃。

为了解决这个问题,我创建了表示表中数据的结构。这样当我删除 Realm 对象时,表不会崩​​溃,因为 Diff 仍然可以访问旧数据。

我在 Realm 中使用结构体的方式如何在 swift 中将结构体保存到 Realm