如何在Swift中传递Realm结果?

时间:2016-08-23 05:20:49

标签: ios swift realm

我有UITableView视图,它查询Realm数据库并列出其结果。该查询包含各种过滤器和排序指令。

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

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

我怀疑这是因为变量是按值分配的,而不是通过引用分配的。

当传递Realm Objects时,建议的做法是传递ID并再次进行查找,但是当涉及到结果时该怎么做?我应该将过滤/排序代码放在UITableViewController和详细控制器都可以访问的位置,以便它们可以单独提取结果吗?或者,有没有更好的方法让我无视?

1 个答案:

答案 0 :(得分:1)

  

如何在Swift中传递Realm结果?

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

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

  

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

除非我误读你的帖子(可能就是这种情况),否则行为不正确。如果Results所限定的线程具有runloop(在iOS上的主线程中总是如此),并且其父Realm已启用autorefresh,则{{ 1}}应该始终反映其Realm的最新状态,它将在每次runloop迭代之间跨线程自动前进到最新状态。

如果支持Results的查询引用的其中一个对象已被删除,则Results将为空,等同于其查询为FALSEPREDICATE时的行为。

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