【问题标题】:NSCollectionView lazy-loading like behaviorNSCollectionView 类似延迟加载的行为
【发布时间】:2014-09-16 17:29:29
【问题描述】:

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

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

这是一个研究工具,不需要漂亮 - 即:东西可以“弹出”。

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

【问题讨论】:

    标签: cocoa nscollectionview


    【解决方案1】:

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

    - (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. 
                     });
                 }
             }
        }
    }
    

    【讨论】:

    • 谢谢,我明天试试,然后报告!你觉得你需要做一些特别的事情来清理看不见的单元格吗?
    • 这是我最初的计划,但是一旦我看到它并不影响性能,我就离开了。如果你想清理它们,你可以将 imageView 图像设置为 nil 如果单元格不在可见的矩形中。
    • 很好的解决方案。但是我认为 NSIntersectsRect 是确定视图是否在可见区域中的更好方法。
    • 嗨,@mohacs,你说你正在使用 SDWebImage 下载图像,但它们不支持 Mac,对吗?
    • @Daniel SDWebImage 支持 OS X 和 IOS。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多