reloadData should be called on the main thread only