在准备好数据之前,如何防止执行cellForItemAtIndexPath?
我将图像从我的服务器返回到我的应用程序的Base64数据,但我不会问我的服务器的图像,直到我有用户的位置,我只会在用户login后应用程序(显示UICollectionView)。
我的问题是collectionView:cellForItemAtIndexPath:
被调用之前,我有数据准备好的单元格。 在我的NSURLConnection
从我的服务器接收到完整的响应并且拥有Base64编码的图像数据之前,我可以通过哪些方法来防止这种方法被调用?
(这也可能是相关的,我使用UICollectionView
作为NSURLConnectionDataDelegate
和NSURLConnectionDelegate
,我有一个单独的类( RenderMetadata()
)将获取图像。)
编辑:谢谢你所有的创新答案! 我已经想出了一个方法来实现我以后的事情。 我会解释,但我没有分享我的代码,所以我不认为这是一个好主意,甚至提出,因为这只会导致混乱。 基本上我已经添加了一个对象到我的视图控制器在我的故事板,它涉及到我正在使用从我的服务器获取Base64编码的图像string的类。
设置集合视图委托,并在收到响应时重新加载集合。 在此之前,让他们留下。 如果集合视图的delegate
和dataSource
为零,则不会加载数据。
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,并且你应该实时地加载/更新/添加每一个单元格(如果合适的话,在没有图像或者占位符的情况下显示它)图像被下载,所以用户不必等待每个图像下载才能看到的东西。