カスタムレイアウトの大きなデータセット(> 2000アイテム)を持つUICollectionViewControllerがあります。セクションを使用すると、スクロールパフォーマンスが非常に不安定になりました。Instrumentsといくつかのテストを使用して、これはレイアウトのルックアップによるものであると判断しました(layoutAttributesForElementsInRect:
)。レイアウト属性をにキャッシュしprepareLayout
、ここでそのように検索します。これは、私が知っている最速の方法です。
[elementsInfo enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath, UICollectionViewLayoutAttributes *attributes, BOOL *innerStop) {
if (CGRectIntersectsRect(rect, attributes.frame)) [allAttributes addObject:attributes];
}];
私は、CPU時間の約25%がこれを列挙するのに費やされ、主にに費やされていることを発見しました[NSIndexPath isEqual:]
。したがって、これらの値をハッシュするためのより高速な方法が必要です。
セクション化されたUICollectionViewFlowLayoutで同じデータを使用してクロステストを実行し、スムーズだったため、可能である必要があります。