带有网络图像的 NSCollectionView
Posted
技术标签:
【中文标题】带有网络图像的 NSCollectionView【英文标题】:NSCollectionView with a network image 【发布时间】:2014-03-27 00:07:01 【问题描述】:我有一个NSCollectionView
,其中一个子视图是NSImageView
。实际图像需要在通过 API 调用后从网络服务器加载(实际上是两个网络请求)。显然我需要异步加载图像。我可以将NSImageView
的值绑定到NSValueTransformer
,从而将模型ID 转换为NSImage
,但是如何实现NSValueTransformer
?它希望立即从其transformedValue:
方法返回,而我只能在那里触发网络请求。我不想使用同步网络阻塞线程。
【问题讨论】:
【参考方案1】:与其使用会立即返回的 NSValueTransformer,不如将集合视图项子类化。对于每个项目,异步触发此子类中的事务。 在您的子类中为 NSImage 保留一个 IBOutlet,以便当从服务器接收到响应时,只需使用此 IBOUlet 设置 Image。 使用这种方法,当创建项目时,相应的视图控制器就会出现。对它进行子类化可以让您控制视图以及如何加载它。
我希望这会有所帮助。
【讨论】:
好的,当我创建子类时,我是否给它自己的 nib 文件?还是我只使用集合视图当前所在的笔尖?那么,我应该重写什么方法来设置图像?设置值:forKeyPath:?如何将绑定连接到子类?我必须全部在代码中完成还是可以使用界面生成器? 您为每个 Collection View 项目定义了一个 itemProtype。子类化集合视图项目,它将自行选择您的项目原型,即 nib 将接受它。在这个新的子类中创建 NSImageView 的 IBOutlet。在 loadView 中调用 [super loadView] 并调用您的事务。一旦在您的回调方法中接收到数据,然后使用 IBOutlet 的 setImage 方法设置图像。子类仅用于处理您的异步调用,因此在接口构建器中只需更改集合视图项的类。我希望你明白了。如果你愿意,我会添加一些代码。 我明白了。我必须在 NSCollectionViewItem 子类中覆盖 setRepresentedObject。还要确保引用视图以强制它从笔尖加载,否则插座很可能为零。以上是关于带有网络图像的 NSCollectionView的主要内容,如果未能解决你的问题,请参考以下文章
来自带有 Opencv C 程序的网络摄像头的灰色图像,但 C++ 程序完美运行