在准备好数据之前,如何防止执行cellForItemAtIndexPath?

我将图像从我的服务器返回到我的应用程序的Base64数据,但我不会问我的服务器的图像,直到我有用户的位置,我只会在用户login后应用程序(显示UICollectionView)。

我的问题是collectionView:cellForItemAtIndexPath:被调用之前,我有数据准备好的单元格。 在我的NSURLConnection从我的服务器接收到完整的响应并且拥有Base64编码的图像数据之前,我可以通过哪些方法来防止这种方法被调用?

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

编辑:谢谢你所有的创新答案! 我已经想出了一个方法来实现我以后的事情。 我会解释,但我没有分享我的代码,所以我不认为这是一个好主意,甚至提出,因为这只会导致混乱。 基本上我已经添加了一个对象到我的视图控制器在我的故事板,它涉及到我正在使用从我的服务器获取Base64编码的图像string的类。

设置集合视图委托,并在收到响应时重新加载集合。 在此之前,让他们留下。 如果集合视图的delegatedataSource为零,则不会加载数据。

 func handleDataLoaded() { // Your code that handles data. ... // Load the collection with data self.collectionView.delegate = self self.collectionView.dataSource = self self.collectionView.reloadData() } 

你需要确保numberOfItemsInSection:返回的值能够准确地反映你想要在你的collectionview中随时使用的单元格的数量。 如果你没有加载任何数据,它应该返回0

您可以将isDataLoaded标志添加到视图控制器类中,初始设置为false ,并在所有数据加载后更改为true

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

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

当所有的数据被加载时,调用reloadData方法来强制重载:

 self.isDataLoaded = true self.reloadData() 

一定要在主线程中执行该代码

你可以按照Paulw11的build议设置数量为0,或者只有当你真正想要显示单元格时设置你的collectionView或者tableView的dataSource,或者当你准备好的时候调用reloadData

但是你应该以另一种方式做出来,你的viewController应该用下载的图像来更新collectionView,并且你应该实时地加载/更新/添加每一个单元格(如果合适的话,在没有图像或者占位符的情况下显示它)图像被下载,所以用户不必等待每个图像下载才能看到的东西。