UICollectionViewで、 reloadData() を呼んだ直後は、visibleCells()でCellがうまく取得できない場合があります。

    collectionView.reloadData()
    print(collectionView.visibleCells()) // 取れたり取れなかったり..。

そんなときは、以下のように、layoutIfNeeded()を呼んであげると、正確に取得することができます。

    collectionView.reloadData()
    collectionView.layoutIfNeeded()
    print(collectionView.visibleCells()) // 取得できる!

同様に、 cellForItematIndexPath() でもvisibleなcellなら取得できるようになります。