【问题标题】:Realm deleted objects strategy and notifications领域删除对象策略和通知
【发布时间】:2017-05-24 21:26:17
【问题描述】:

这不是一个问题,而只是一个一般性问题,即如果后台线程中发生更改,如何发送领域集合更改通知。

所以有一个场景(在 Realm Cocoa 中):

  1. RLMResults 类 Foo: RLMObject 的对象是从默认领域获取的。然后将列表转换为数组[Foo] 并在视图控制器中保存为变量(没关系)
  2. 表格显示 foo 对象的列表
  3. 后台线程中删除了一些对象
  4. 用户滚动表格视图,重新使用单元格,访问索引 x 处的数组对象,但它在后台线程中被删除并发生崩溃,因为object was deleted or invalidated。正如预期的那样。

为了解决我们可以使用集合通知并在发生更改时刷新列表的问题。正如我尝试的一切都按预期工作,但是在主线程上调度通知之前是否可能会发生单元重用的调度,以便单元设置方法将使用无效对象?

只是试图尽可能详细地解释这个问题。

主要问题是在后台线程和视图(无论是表格单元格还是任何其他视图)上与服务器(不使用 Realm 的移动平台)同步数据时,都持有对可能的引用的情况- 删除的对象。在尝试对对象执行某些操作时检查对象是否无效是否是一种好习惯,因为它可以在后台线程上被删除。

我看到了几个解决方案:

  • 每次访问RLMObject子类对象的引用时检查它是否无效
  • 将对象包装到视图模型中(保留自更新模型功能的所有好的部分),然后在尝试更改模型时留下另外两个解决方案:
    • 在视图模型中保存对象 ID,以便在尝试更改时可以再次获取对象
    • 引用与第一点有相同问题的对象本身

对此有何建议?

编辑:

如果对象Foo 很复杂,有时使用Results 和List 是不可能的。例如,当打开 Foo 表视图的详细信息屏幕时,有许多不同的单元格访问 Foo 类对象的属性。因此,关于已删除对象屏幕的通知可能会被关闭,但是当用户滚动时,单元格是否可能正在访问无效对象?

也许这个问题只是愚蠢的,关于引发条件的过度设计,但我很好奇主线程上的调度是否有可能发生:object becomes invalidated (I don't know how that happens in realm internally> 然后some code which access that object 然后notification about invalidated object

【问题讨论】:

    标签: ios multithreading cocoa realm


    【解决方案1】:

    然后将列表转换为数组 [Foo] 并在视图控制器中保存为变量(没关系)

    你为什么这样做?这迫使Results 中的每个对象都被物化到内存中,并创建(可能很昂贵)Swift 级别的对象访问器,并从磁盘读取一些数据库数据。所有 Realm 集合都符合 Swift 标准库的 CollectionType 协议,这意味着它的行为已经与其他集合(例如 Array)一样。将所有Results 元素复制到Array 中也意味着该数组将很快与其基础数据不同步,因为Array 不像Results 那样自动更新。

    这很容易解释为什么您复制到 Array 中的一些 Realm 对象随后会被删除,从而导致对象失效,这意味着任何后续访问都违反了 Realm 的 API。

    长话短说,不要将Results、List 或任何其他Realm 集合复制到Array。

    【讨论】:

    • 感谢您的回答。是的,我知道 Realm 在使用 mmap 时是如何工作的,但有时表格视图会显示单个对象,请参阅问题的编辑。
    • 我已经阅读了您的编辑,但我仍然不明白为什么您更喜欢从 List 或 Results 中复制所有数据,这会在 Foo 很复杂时有所帮助。
    • 我不是在谈论列表,我是在谈论在表格视图中显示单个 Foo 对象。就像表源文件引用单个 Foo 对象并在行中显示它的详细信息一样。
    • 如果您谈论的是单个Foo 对象,那么将对象存储在List、Results 或Array 中有何关系?
    • 在这一点上,我宁愿谈论对屏幕中单个对象的单个引用(即细节屏幕)。最终的问题是关于调度的顺序(在问题的末尾)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多