Cocoa nsCollection查看类似延迟加载的行为

Cocoa nsCollection查看类似延迟加载的行为,cocoa,nscollectionview,Cocoa,Nscollectionview,我试图从我的NSCollectionView中获得类似延迟加载的行为。(老实说,我认为它有它,就像一个UtableView-似乎是一个明显的遗漏?) 无论如何,我正在单元格中显示图像,并且希望在图像即将滚动到视图时加载图像,并在图像离开后卸载它们 这是一个研究工具,不需要漂亮——即:东西可以“突然”进来 有什么想法吗?我的第一个想法是找到一些方法让集合中的视图知道它们何时出现在屏幕上,但是drawrect似乎被调用了很多次,远远超过屏幕上的视图。正如您所提到的,NScollectionView一

我试图从我的NSCollectionView中获得类似延迟加载的行为。(老实说,我认为它有它,就像一个UtableView-似乎是一个明显的遗漏?)

无论如何,我正在单元格中显示图像,并且希望在图像即将滚动到视图时加载图像,并在图像离开后卸载它们

这是一个研究工具,不需要漂亮——即:东西可以“突然”进来


有什么想法吗?我的第一个想法是找到一些方法让集合中的视图知道它们何时出现在屏幕上,但是drawrect似乎被调用了很多次,远远超过屏幕上的视图。

正如您所提到的,
NScollectionView
一次构建所有单元格。特别是如果单元内有大量图像导致性能问题。这就是我解决问题的方法。也许会有更好的解决方案,但这对我来说很好。 很长一段时间以来,我观察了使用工具的代码的性能,并没有看到任何不利的一面

- (void)windowDidLoad {
    //Here adding observer to NSCollectionView's scrollview to monitor bounds changes.
    NSView *contentView = [scrollViewOfYourCollectionView contentView];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundDidChange:) name:NSViewBoundsDidChangeNotification object:contentView];
}

- (void)boundDidChange:(NSNotification *)notification
{
    NSRect collectionViewVisibleRect = yourCollectionView.visibleRect;
    //collectionViewVisibleRect.size.height += 300; //If you want some preloading for lower cells...

    for (int i = 0; i < yourDataSourceArray.count; i++) {
         NSCollectionItem *item = [yourCollectionView itemAtIndex:i];
         if (NSPointInRect(NSMakePoint(item.view.frame.origin.x, item.view.frame.origin.y), collectionViewVisibleRect) == YES)
         {
             if (item.imageView.image == nil) {
                 dispatch_async(dispatch_get_main_queue(), ^{
                 //Fill your cells. 
                 //to showing/downloading images I am using SDWebImage. 
                 });
             }
         }
    }
}
-(无效)windowDidLoad{
//这里向NSCollectionView的scrollview添加观察者以监视边界更改。
NSView*contentView=[scrollViewOfYourCollectionView contentView];
[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(boundDidChange:)名称:NSViewBoundsDidChangeNotification对象:contentView];
}
-(无效)更改:(NSNotification*)通知
{
NSRect collectionViewVisibleRect=yourCollectionView.visibleRect;
//collectionViewVisibleRect.size.height+=300;//如果要对较低的单元格进行预加载。。。
for(int i=0;i
谢谢,我明天会试试看,然后回来汇报!你发现你需要做什么特别的事情来清理看不到的单元格吗?这是我最初的计划,但一旦我看到它不影响性能,我就离开了。若你们想清理它们,你们可以将imageView设置为nil,若你们的单元格超出了可见矩形。这是一个很好的解决方案。不过,我认为,通过NSIntersectsRect可以更好地确定视图是否位于可见区域。您好,@mohacs,您说您正在使用SDWebImage下载图像,但它们不支持Mac,对吗?@Daniel SDWebImage同时支持OS X和IOS。