ios - 如何在 Swift 中传递 Realm 结果?

标签 ios swift realm

我有一个查询 Realm 数据库并列出其结果的 UITableView View 。查询包含各种过滤器和排序指令。

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

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

我怀疑发生这种情况是因为变量是按值分配的,而不是按引用分配的。

传递 Realm 对象时,建议做的事情是传递 ID 并再次进行查找,但是当涉及到结果时该怎么办?我是否应该将过滤/排序代码放在 UITableViewController 和详细信息 Controller 都可以访问的地方,以便它们都可以分别提取结果?或者,是否有我忽略的更好方法?

最佳答案

How to pass Realm Results around in Swift?

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

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

Now, if a user has gone into the detail view, and someone deletes an item remotely, the Results set that was assigned to the detail view is now inconsistent. It doesn't get updated, even though the original Results in the table view does get updated.

除非我误读了您的帖子(可能是这种情况),否则这是不正确的。如果 Results 所在的线程有一个 runloop(在 iOS 的主线程上总是这样),并且它的父 Realm 启用了 autorefresh,那么Results 应始终反射(reflect)其 Realm 的最新状态,该状态将在每次 runloop 迭代之间跨线程自动推进到最新状态。

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

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

关于ios - 如何在 Swift 中传递 Realm 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39092929/

相关文章:

ios - 如何将 UIScrollView 中的内容设置在中间,以便用户可以在 iOS 中左右滚动

ios - 如何调用func渲染器(_ :didAdd:for:)

ios - AudioKit:如何将 AKOperation 参数值设置为 Double 进行操作?

ios - Realm 将数据附加到类型 List<t>

swift - 我可以在不知道对象是什么类型的情况下从数据库中获取对象吗?

html - 未安装应用程序时,我的应用程序不显示智能应用程序横幅

iOS 7 SDK 中的 iOS 模拟器

ios - 如何根据用户输入更新约束

swift - 如何轻松复制/复制现有 Realm 对象

ios - 在 iOS 应用程序上使用 xbuild 不会生成 ipa