2015-01-20 37 views
0

我将图像作为Base64数据从我的服务器返回到我的应用程序,但我不会问我的服务器的图像,直到我有用户的位置,我只会在用户登录后到应用程序(显示UICollectionView)。在我准备好数据之前,如何防止执行cellForItemAtIndexPath?

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

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

编辑:感谢您的所有创新的解答!我已经想出了一种实现我之后的方式。我会解释一下,但是我没有分享我的代码,所以我不认为这是一个好主意,甚至提出来,因为这只会导致混淆。基本上,我在故事板中添加了一个对象到我的视图控制器中,该对象引用了我用来从服务器获取Base64编码图像字符串的那个类。

+0

你试图解决什么问题;你是否会崩溃,或者你只是不想看到一个空的集合视图?您希望用户在收到数据之前看到什么?你可以隐藏集合视图,或者你可以在其中放置占位符数据。 – rdelmar 2015-01-20 21:18:23

回答

3

您需要确保numberOfItemsInSection:返回的值准确地反映了您随时想要在collectionview中使用的单元格数量 - 即。如果您尚未加载任何数据,则应返回0

+0

如何更改'numberOfItemsInSection:'以返回从服务器接收图像后返回的图像数量? – IIllIIll 2015-01-20 21:29:31

+0

如果没有看到您的代码并确切知道您如何加载数据,这是不可能的。如果您已加载一个数据源中的项目列表,然后需要异步获取图像,则可能更容易将占位符图像放入单元格中,如@redelmar所述,并在加载图像时刷新单元格。 SDWebImage可以帮助解决这个问题 – Paulw11 2015-01-20 21:43:48

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() 
} 
0

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

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

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

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

self.isDataLoaded = true 
self.reloadData() 

确保在主线程中执行该代码

0

您可以按照Paulw11, 的建议将数目设置为0或设置dataSource你的collectionView或tableView只有当你真的想让它显示单元格时 或者在你准备好时调用reloadData

但是你应该以另一种方式做出来,你的viewController应该照顾用下载的图像更新collectionView,你应该下载/更新/添加每一个单元格(在没有图像或没有占位符的情况下显示它,如果适当的话),一旦它自己的图像被下载,所以用户在看到某些东西之前不必等待每个图像下载。

相关问题