【发布时间】:2017-05-24 21:26:17
【问题描述】:
这不是一个问题,而只是一个一般性问题,即如果后台线程中发生更改,如何发送领域集合更改通知。
所以有一个场景(在 Realm Cocoa 中):
-
RLMResults类Foo: RLMObject的对象是从默认领域获取的。然后将列表转换为数组[Foo]并在视图控制器中保存为变量(没关系) - 表格显示 foo 对象的列表
- 后台线程中删除了一些对象
- 用户滚动表格视图,重新使用单元格,访问索引 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