RealmSwift 限制和获取最后 30 条记录到 tableview

Posted

技术标签:

【中文标题】RealmSwift 限制和获取最后 30 条记录到 tableview【英文标题】:RealmSwift limiting and fetching last 30 records into tableview 【发布时间】:2016-12-13 06:14:12 【问题描述】:

我是使用 RealmSwift 的新手,我正在使用 swift 3.0 和后端数据库作为 RealmSwift 创建类似聊天的应用程序。虽然将聊天插入到领域中效果很好,但获取记录时的事情

let newChat = uiRealm.objects(Chats.self).filter(
    "(from_id == \(signUser!.user_id) 
         OR from_id == \(selectedList.user_id))
         AND (to_id == \(signUser!.user_id) 
         OR to_id == \(selectedList.user_id))"
).sorted(byProperty: "id", ascending: true)

我不知道如何限制聊天对话的最后 30 条记录。在上面的代码中,我只是从“Chat”表中获取记录,并将聊天过滤为“SIGNED USERID AND TO USERID”。而且,如果我列出了特定聊天的所有记录(例如超过 150 个聊天对话),则从 tableview 向上滚动记录会卡住或挂起一段时间。因此,请提供一些关于如何限制最后 30 条记录并停止挂起 tableview 的想法。提前致谢

【问题讨论】:

你读过realm.io/docs/swift/latest/#limiting-results 吗? 是的,我读到了,实际上,如果我总共有 60 条记录,那么我限制了从第 31 条记录到第 60 条记录的最后 30 条记录。问题是如何给出初始值,因为我知道最后一条记录是 60 【参考方案1】:

就像我写的 in the Realm documentation 一样,因为 Realm Results 对象是延迟加载的,如果您查询所有对象然后简单地加载您需要的对象并不重要。

如果要将其排列到表视图中,可以创建一个辅助方法,将最后 30 个结果映射到 0-30 索引范围,然后直接传递到表视图的数据源会更容易:

func chat(atIndex index: Integer) -> Chats 
   let mappedIndex = (newChat.count - 30) + index
   return newChat[mappedIndex]

如果您已经成功查询并开始访问这些对象(即查询本身没有挂起),我不确定为什么表视图会在事后挂起。您可以尝试在 Instruments 中运行 Time Profiler,以准确追踪导致主线程被阻塞的原因。

【讨论】:

以上是关于RealmSwift 限制和获取最后 30 条记录到 tableview的主要内容,如果未能解决你的问题,请参考以下文章

mysql中如何查询表的第一条和最后一条记录

限制从 s-s-rS 中的数据库单次获取数据

shopnc框架数据库查询限制30条记录

shopnc框架数据库查询限制30条记录

thinkphp 怎么获取多天最后一条记录

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?