Realm, объект был удален или признан недействительным - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь создать новое приложение для iOS и использую библиотеку RxSwift и Realm в качестве базы данных.

Я создаю табличное представление, которое показывает список объектов из области, и эти объекты должны быть редактируемыми и могут быть удалены.(Я не использую возможности редактирования представления таблицы для этого.)

Теперь, когда я удаляю элемент из таблицы, таблица должна обновиться, потому что я использовал RxSwift, чтобы связать представление таблицы с результатами Realm.Но вместо обновления вылетает приложение.

Ошибка, возникающая при сбое приложения: 'RLMException', reason: 'Object has been deleted or invalidated.' Также в выводе отображается трассировка стека, но я не могу найти источник / причину сбоя.

Выводstacktrace:

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
)

Мой вопрос: если кто-то знает, что я делаю неправильно, и наблюдаю, как правильный способ удаления объекта области использует RxSwift и Databinding?

Редактировать:

Я сделал небольшой тестовый проект и поместил его на свой github, он выдает ошибку при нажатии кнопки deleteFirst.https://github.com/Hiiragisan09/ios-example-project-realm-test

Screenshot of the app crash

1 Ответ

0 голосов
/ 18 мая 2018

Я нашел решение сам.

Когда я начал использовать Realm, я не знал, что объект видоизменяется, если вы его удалите.

Это была небольшая борьба, потому что когда происходит сбой области на «объект области был удален или признан недействительным», это не дает стековой трассировки того, где вы пытались получить доступ к свойству объекта realmobject.

Таким образом, когда вы удаляете элемент из Царства, он вызывает таблицу для получения новых элементов, а поскольку таблица анимирована, она будет пытаться сопоставить новые данные со старыми данными. И когда Diff попытается получить доступ к свойству старых данных, он потерпит крах.

Для решения проблемы я создал структуры, которые представляют данные в таблице. Так что, когда я удаляю объект Realm, таблица не будет аварийно завершена, потому что Diff все еще может получить доступ к старым данным.

То, как я использую структуры с областью Как сохранить структуру в области в быстрой

...