我将图像作为Base64数据从我的服务器返回到我的应用程序,但是在我拥有用户位置之前我不会向我的服务器询问图像,我只会在用户登录后才会这样做进入应用程序(显示UICollectionView)。
我的问题是,在为单元格准备好数据之前,正在调用collectionView:cellForItemAtIndexPath:
。在我的NSURLConnection
收到来自我的服务器的完整响应并且我有Base64编码的图像数据之前,我可以通过哪些方法阻止调用此方法?
(我可能会将UICollectionView
用作NSURLConnectionDataDelegate
和NSURLConnectionDelegate
并且我有一个单独的类(RenderMetadata()
)来获取图像。)
编辑:感谢您的所有创新答案!我找到了实现我追求的方法。我会解释但是我还没有分享我的代码,所以我认为提出这个代码并不是一个好主意,因为这只会导致混乱。基本上我在我的故事板中为我的视图控制器添加了一个Object,它引用了我用来从我的服务器获取Base64编码图像字符串的那个类。
答案 0 :(得分:4)
设置集合视图委托并在收到响应时重新加载集合。在此之前,保持他们的生活。如果集合视图的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()
}
答案 1 :(得分:3)
您需要确保numberOfItemsInSection:
返回的值始终准确反映您在集合视图中所需的单元格数量 - 即。如果您尚未加载任何数据,则应返回0
答案 2 :(得分:0)
您可以向视图控制器类添加isDataLoaded
标志,最初设置为false
,并在加载所有数据后更改为true
。
然后,在numberOfSections
方法中,如果未设置该标志,则返回0:
func numberOfSections() {
return self.isDataLoaded ? 1 : 0
}
加载所有数据后,调用reloadData
方法强制重新加载:
self.isDataLoaded = true
self.reloadData()
确保在主线程中执行该代码
答案 3 :(得分:0)
您可以按照Paulw11的建议将拖曳数设置为0, 或者只在实际希望它显示单元格时设置collectionView或tableView的dataSource 或者在准备好时调用reloadData
但你应该以另一种方式制作它,你的viewController应该用下载的图像来处理更新collectionView,你应该自我加载/更新/添加每一个单元格(如果合适,显示没有图像或占位符)一旦下载了自己的图像,用户就不必在看到之前等待每个图像下载。