大型数组上的Valueurl绑定导致用户界面缓慢

时间:2010-03-30 02:55:44

标签: objective-c binding nstableview nscollectionview

我有一个大型数据集(大约3500个对象),它通过HTTP从远程服务器返回。目前,数据正在NSCollectionView中呈现。数据的一个方面是服务器的路径包,用于表示数据的小图像(为简单起见,想想缩略图)。

Bindings可以很好地处理已经返回的数据,并且通过valueurl绑定绑定图像很容易。但是,滚动数据集时用户界面非常缓慢 - 这让我觉得NSCollectionView正在检索所有图像数据,而不仅仅是用于显示当前可查看图像的图像数据。

我的印象是Cocoa控件非常智能,只能检索通过延迟加载实际输出到用户界面的信息的数据。 NSTableView似乎就是这种情况 - 但我可能会误解这个想法。

值得绑定是否应该懒散地行动,而且,它应该在NSCollectionView懒惰地行动吗?

我可以创建一个缓存机制(事实上我已经为另一个应用程序准备了这样的东西 - 如果你对Populating NSImage with data from an asynchronous NSURLConnection感兴趣的话,请看我的帖子)但我真的不想走这条路线我不必为此特定实现,因为用户可能经常更改数据集,并且可能只需要小的数据子集。

任何建议的方法?

谢谢!

更新

经过一些测试之后,似乎问题就出现了,因为通过数据集的滚动操作会导致从服务器请求每个图像。一旦所有图像都在数据集中传递,响应就会非常快。

所以问题......在滚动完成时滚动并重新打开时,有没有办法关闭valueurl fetch?

1 个答案:

答案 0 :(得分:0)

我的解决方案是使用自定义缓存机制,就像我已经用于其他应用程序的机制一样。这个问题本身就是因为当您滚动浏览尚未下载的图像时,控件会触发自己去获取尚未下载的文件。

下载后,图像在本地可用,因此滚动速度会正常化。解决方案是检查图像是否在本地可用,并在后台下载图像时显示备用应用程序包图形。下载图像后,使用图像更新模型,替换来自图像束的存根图像。

这使得UI始终处于非常敏感的状态,使用户能够进行交互,并允许对图像进行自定义后台管理。

当然,如果Cocoa为我提供所有这些,那会很好,但那么我还有什么可做的呢? : - )