No, it is not a bad practice at all.
Just a short overview, So you get your answer
UICollectionView is highly optimized, and thus only keep On-screen visible rows in memory. Now, All rows Cells are cached in Pool and are reused and not regenerated.
Whenever, user scrolls the UICollectionView, it adds the just-hidden rows in Pool and reuses them for next to be visible rows.
So, when you call reloadData(), it simply updates the data in row cells, like updating the UILabel text and the update occurs only for visible cells, and the process goes on.
Now, Consider you have ten rows visible in your collection view and while calling
reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
you simply update the UILabel like elements for only those items,
but if you call reloadData(), you update the data for ten visible items, which doesn't make any difference as it is a very light process.
You should use reloadData() everywhere. Keep it simple and readable. Performance wise, reloadItems doesn't make any difference.
It is properly elaborated in Apple Docx
Apple Link
Call this method to reload all of the items in the collection view.
This causes the collection view to discard any currently visible items
and redisplay them. For efficiency, the collection view only displays
those cells and supplementary views that are visible. If the
collection data shrinks as a result of the reload, the collection view
adjusts its scrolling offsets accordingly.