2014-07-24 3 views
5

NSCollectionView에서 지연로드 동작을 시도하고 있습니다. (솔직히 나는 그것이 UITableView와 같은 것으로 생각했다 - 명백한 누락과 같이 보였습니까?)NSCollectionView lazy-loading like 동작

어쨌든, 저는 셀에 이미지를 표시하고 있으며 이미지를 스크롤하여보기에로드하려고합니다. 그들이 떠난 후.

이 연구 도구를하고있을 필요가 없습니다 꽤 - 예 :에 "팝업"수 물건

어떤 아이디어가.? 첫 번째 생각은 컬렉션의 뷰가 화면 상에있을 때를 알 수있는 방법을 찾는 것이지만 드로 프린트는 화면에 보이는 것보다 훨씬 많은 시간이 걸리는 것처럼 보입니다.

답변

7

언급했듯이 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. 
       }); 
      } 
     } 
    } 
} 
+0

감사합니다. 내일 다시 신고 해 드리겠습니다. 보기에없는 세포를 청소하기 위해 특별한 조치를 취해야한다는 것을 알고 있습니까? – user441669

+0

하지만 원래의 성능은 성능에 영향을 미치지 않습니다. 그들을 지우고 싶다면 셀이 보이지 않는 경우 imageView 이미지를 nil로 설정할 수 있습니다. – mohacs

+0

나를 위해 위대한 일, 고마워. – user441669