2014-07-24 14 views
5

Ich versuche, lazy-loading-ähnliches Verhalten aus meiner NSCollectionView zu bekommen. (ehrlich gesagt nahm ich an, dass es hatte, wie eine UITableView - scheint wie eine offensichtliche Unterlassung?)NSCollectionView lazy-loading-ähnliches Verhalten

Wie auch immer, ich zeige Bilder in den Zellen, und möchte Bilder laden, wie sie in Sicht zu scrollen, und entladen sie, nachdem sie gegangen sind.

Dies ist für ein Forschungswerkzeug und muss nicht schön sein - das heißt: stuff können „Pop“ in

Irgendwelche Ideen.? Mein erster Gedanke ist es, einen Weg zu finden, auf dem die Ansichten in der Sammlung wissen, wann sie auf dem Bildschirm sind, aber der Ausdruck scheint viele Male öfter aufgerufen zu werden als auf dem Bildschirm.

Antwort

7

Wie Sie erwähnen, erstellt NScollectionView alle Zellen auf einmal. Insbesondere, wenn sich in Zellen viele Bilder befinden, die Leistungsprobleme verursachen. So löse ich das Problem. Es könnte eine bessere Lösung geben, aber soweit das für mich funktioniert. Seit langer Zeit habe ich die Leistung des Codes mit Instrumenten beobachtet und habe keine Nachteile gesehen.

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

Danke, ich werde das morgen versuchen und melden! Finden Sie, dass Sie etwas Besonderes tun müssen, um die Zellen, die nicht in Sicht sind, aufzuräumen? – user441669

+0

Es war mein ursprünglicher Plan, aber sobald ich gesehen habe, dass es keinen Einfluss auf die Leistung hat, habe ich es verlassen. Wenn Sie sie bereinigen möchten, können Sie imageView image auf Null setzen, wenn die Zelle nicht mehr sichtbar ist. – mohacs

+0

Funktioniert gut für mich, danke. – user441669

Verwandte Themen