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

时间:2015-01-20 21:09:03

标签: ios objective-c swift nsurlconnection

我将图像作为Base64数据从我的服务器返回到我的应用程序,但是在我拥有用户位置之前我不会向我的服务器询问图像,我只会在用户登录后才会这样做进入应用程序(显示UICollectionView)。

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

(我可能会将UICollectionView用作NSURLConnectionDataDelegateNSURLConnectionDelegate并且我有一个单独的类(RenderMetadata())来获取图像。)

编辑:感谢您的所有创新答案!我找到了实现我追求的方法。我会解释但是我还没有分享我的代码,所以我认为提出这个代码并不是一个好主意,因为这只会导致混乱。基本上我在我的故事板中为我的视图控制器添加了一个Object,它引用了我用来从我的服务器获取Base64编码图像字符串的那个类。

4 个答案:

答案 0 :(得分:4)

设置集合视图委托并在收到响应时重新加载集合。在此之前,保持他们的生活。如果集合视图的delegatedataSource为零,则无法加载数据。

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,你应该自我加载/更新/添加每一个单元格(如果合适,显示没有图像或占位符)一旦下载了自己的图像,用户就不必在看到之前等待每个图像下载。