懒惰地加载 NSTableView

Posted

技术标签:

【中文标题】懒惰地加载 NSTableView【英文标题】:Loading NSTableView Lazily 【发布时间】:2012-04-23 10:52:34 【问题描述】:

ios 上,NSTableView (UITableView) 会延迟加载,因为表格只显示当前视图所需的单元格,而不是更多。当用户向上或向下滚动时,会从数据源加载更多信息。

OSX 有类似的东西吗?我有一个 NSTableView 有 1000 多条记录要加载(+多列),这导致加载延迟以及向上或向下滚动时的延迟。

这种“延迟”加载会是一个好的解决方案(如果可能的话)吗?或者可能是类似的东西?

谢谢。

附:关于加载过程-我使用两种常用方法

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

-(NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView

加载数据。其中有 if 语句来检查一些变量,因为我有 2 个包含数据的组合框,当包含“ALL”和“ALL”时会加载这 1000 多条记录。如果组合框不是“ALL”和“ALL”,则只加载几条记录,加载正常。

鉴于您已经解释过延迟加载是自动完成的,我认为问题在于我正在从 XML 文件加载数据,因此解析可能会占用大量处理时间。

我虽然在运行时将 XML 文件中的数据加载到 NSDictionary 中,并将其保存在内存中,以便在需要时使用,这样我就可以避免实际需要显示信息时的加载时间。

你怎么看?谢谢!

【问题讨论】:

NSTableView 内容确实是延迟加载的。您是通过数据源还是通过绑定提供数据?如果通过数据源,请发布您对objectValueForTableColumn: row: 的实现。如果通过绑定,请查看访问器,看看它们中是否有比返回现有 ivar 更复杂的处理。 @Dondragmer 是完全正确的。 NSTableView 不会延迟加载的唯一原因是您做错了什么。我们需要有关您如何填充表格视图的更多信息。 谢谢大家!我添加了一个 P.S.提供更多信息。 【参考方案1】:

您肯定希望将您的 XML 文件缓存到某种数据结构中。 tableView:objectValueForTableColumn:row: 方法将对每个可见单元格调用一次。如果您有很多列,则很容易看到 200 个单元格。向下翻页,这些单元格都发生了变化,您的 XML 文件加载了 200 次,并且滚动变得迟缓。

即使只为特定列中的每个单元格加载和解析 XML 文件,它也会很慢并且应该修复。

您可以通过使 tableView:objectValueForTableColumn:row: 返回 nil 来验证缓存是否必要,否则它将解析 XML 文件。进行此更改后,它滚动是否顺畅,还是有其他问题?这显然会使应用程序无法使用,但在实施之前,您应该始终检查优化是否必要和充分。

【讨论】:

你能扩展一下“让单元格返回 nil”吗? 我重新措辞了我的答案。只有在您进行此更改后,有关滚动的问题才有意义。

以上是关于懒惰地加载 NSTableView的主要内容,如果未能解决你的问题,请参考以下文章

懒惰地从 PostgreSQL / Cassandra 创建 Dask DataFrame

如何标记多个资源从属性中懒惰地读取它们?

懒惰地在冬眠中加载一个clob

无法懒惰地初始化角色集合,..无法初始化代理 - 无会话 - JPA + SPRING

防止 Hibernate 加载懒惰的 ManyToOne

Haskell 不会懒惰地评估交错