如何防止cellForItemAtIndexPath从执行之前,我有我的资料准备好了?(How do

2019-10-29 10:48发布

我回的图像为Base64数据从我的服务器我的应用程序,但我不会要求我的服务器的图像,直到我有用户的位置信息,我想只在用户登录后,在到应用(其中显示UICollectionView)。

我的问题是collectionView:cellForItemAtIndexPath:是被调用之前我有数据准备好细胞。 这方面我可以阻止调用,直到我的这种方法NSURLConnection已收到来自我的服务器全响应和我有Base64编码的图像数据吗?

(这也可能是相关的,我使用的UICollectionView作为NSURLConnectionDataDelegateNSURLConnectionDelegate和我有一个单独的类( RenderMetadata()将获取的图像。)

编辑:感谢您的所有创新的答案! 我想出了一个办法来实现我是什么了。 我想解释,但我还没有分享我的代码,所以我不认为这是一个好主意,甚至把它,因为这只会导致混乱。 基本上我已经在我的故事板,其中提到的是类我用来从我的服务器Base64编码图像的字符串加到一个对象到我的视图控制器。

Answer 1:

设置集合视图代表和当您收到响应重装集合。 在此之前,让他们nilled。 如果delegatedataSource集合视图是零它不会加载数据。

func handleDataLoaded() 
{
    // Your code that handles data.
    ...

    // Load the collection with data
    self.collectionView.delegate = self
    self.collectionView.dataSource = self

    self.collectionView.reloadData()
}


Answer 2:

你需要确保返回的值numberOfItemsInSection:准确地反映你在的CollectionView在任何时候都想要细胞的数量-即。 如果你还没有加载任何数据,它应该返回0



Answer 3:

您可以添加isDataLoaded标志的视图控制器类,最初设置为false ,并改为true ,一旦所有的数据都被加载。

然后,在numberOfSections方法返回0,如果没有设置该标志:

func numberOfSections() {
    return self.isDataLoaded ? 1 : 0
}

当所有数据被加载,调用reloadData方法来迫使一重装:

self.isDataLoaded = true
self.reloadData()

请务必在主线程来执行代码



Answer 4:

您可以设置丝束为0的个数由Paulw11的建议,或将您的CollectionView或的数据源的tableView只有当你真正想让它显示的细胞或致电reloadData当你准备好

但是,你应该以另一种方式做它,你的viewController应注意与下载的图像更新的CollectionView的,你应该reaload /更新/添加每一个细胞(表明它没有图像或占位符,如果适用),一旦它自己图像被下载,这样用户就不必等待每个图像下载之前看到的东西。



文章来源: How do I prevent cellForItemAtIndexPath from executing before I have my data ready?