2016-08-23 84 views
3

我有查询Realm数据库并列出其结果的UITableView视图。该查询包含各种过滤器和排序指令。如何在Swift中传递Realm结果?

当用户选择一个表项时,它们被带到一个详细视图,允许他们向左或向右滑动来查看查询中的前一个/下一个结果(按照它们出现在UITableView中的顺序)。这个细节视图是一个单独的ViewController,我现在正在将结果传递给细节视图控制器,以便它可以在它们之间来回移动。

这很好,直到引入删除项目的能力。用户可以删除项目,我说用户是因为其他人可以删除项目,并且删除将传播给所有用户(通过互联网)。现在,如果用户已进入详细信息视图,并且某人远程删除了某个项目,则分配给详细视图的结果集现在不一致。即使表格视图中的原始结果确实得到更新,它也不会更新。

我怀疑会发生这种情况,因为该变量是由值而不是由引用。

当传递Realm对象时,推荐的做法是传递ID并再次执行查找,但涉及到结果时该怎么办?我应该把过滤/排序代码放在一个UITableViewController和细节控制器都可以访问的地方,以便它们都可以单独提取结果吗?或者,有没有更好的办法,我忽略了?

回答

1

如何在Swift中传递Realm结果?

您可以直接传递Results实例。它们按照Realm Swift文档的Auto-Updating Results部分中的描述通过引用和自动更新传递。

您也可以传递NSPredicate或表示查询的查询字符串以避免Results固有的线程限制。

现在,如果用户已进入详细视图,并且某人远程删除某个项目,那么分配给详细视图的结果集现在不一致。即使表格视图中的原始结果确实得到更新,它也不会更新。

除非我误读了你的文章(可能是这种情况),这种行为是不正确的。如果Results所限制的线程有runloop(iOS上的主线程始终是这种情况),并且其父Realm已启用autorefresh,则Results应始终反映它的Realm的最新状态,这将是在每个runloop迭代之间的线程中自动进入最新状态。

如果支持Results的查询所引用的对象之一已被删除,则Results将为空,与其查询为FALSEPREDICATE时的行为相同。

如果这与您所看到的行为不匹配,那么您可能在Realm中发现了一个错误,在这种情况下,我建议您使用file a GitHub issue以便Realm人员可以进行调查。