NSCollectionView подобное поведение с ленивой загрузкой

Я пытаюсь получить от моего NSCollectionView поведение, подобное ленивой загрузке. (честно говоря, я предполагал, что это было, как UITableView - кажется очевидным упущением?)

В любом случае, я показываю изображения в ячейках и хотел бы загружать изображения, когда они собираются прокрутиться, и выгружать их после того, как они уйдут.

Это инструмент для исследования, и он не должен быть красивым, например: что-то может «всплывать».

Любые идеи? Моя первая мысль - найти способ, чтобы представления в коллекции знали, когда они находятся на экране, но drawrect, кажется, вызывается много-много раз, гораздо чаще, чем представлений на экране.


person user441669    schedule 24.07.2014    source источник


Ответы (1)


Как вы упомянули, 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. 
                 });
             }
         }
    }
}
person mohacs    schedule 25.07.2014
comment
Спасибо, завтра попробую и доложу! Считаете ли вы, что вам нужно сделать что-нибудь особенное, чтобы очистить ячейки, которые не находятся в поле зрения? - person user441669; 25.07.2014
comment
Это был мой первоначальный план, однако, как только я увидел, что он не влияет на производительность, я отказался от него. Если вы хотите их очистить, вы можете установить для изображения imageView значение nil, если ячейка находится вне видимого прямоугольника. - person mohacs; 25.07.2014
comment
Отличное решение. Однако я думаю, что NSIntersectsRect - лучший способ определить, находится ли представление в видимой области. - person Xhacker Liu; 17.03.2015
comment
Привет, @mohacs, вы говорите, что используете SDWebImage для загрузки изображений, но они не поддерживают Mac, верно? - person Daniel; 30.06.2015
comment
@Daniel SDWebImage поддерживает как OS X, так и IOS. - person mohacs; 30.06.2015