2015-01-20 66 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,你應該下載/更新/添加每一個單元格(在沒有圖像或沒有佔位符的情況下顯示它,如果適當的話),一旦它自己的圖像被下載,所以用戶在看到某些東西之前不必等待每個圖像下載。