2014-03-03 77 views
0

這裏是我的pseduo代碼:從collectionView :: didEndDisplayingCell調用reloadData。它會導致應用程序凍結。爲什麼?

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"didEndDisplayingCell %@", indexPath); 
    if (collectionView == self.viewA) { 
     ... 
     cities_in_viewB = [NSArray arrayWithArray:all_cities_subset]; 
     __weak UICollectionView* weak_viewB = self.viewB; 
     dispatch_async(dispatch_get_main_queue(),^{ 
      [weak_viewB reloadData]; 
     }); 
    } 
} 

reloadData之後被調用時,應用程序出現在IOS被凍結。爲什麼?

編輯

基於奧列格·索伯列夫的回答,我已經重構了代碼,發現問題是不相關的遞歸。正如你可以在示例代碼中看到的,獲取重載呼叫是viewB。在這個didEndDisplayingCell裏面的viewA不受影響。

發生什麼事是我在代碼中有一個while循環(未顯示)爲viewB準備一組新數據。退出條件寫得很糟糕。

但是,如果遞歸是一個問題,我仍然希望看到一個可能的解決方案。

+0

我沒有回答你的問題?您只需在視圖控制器的生命週期中進行遞歸。 –

+0

對不起,我找到了一個根本原因,它與遞歸調用無關。我將在問題 –

+0

中記下更多詳細信息。此函數將調用您的collectionView中的每個**項目。我認爲問題是viewA中有很多項目。所以,你有沉重的計算。你不應該使用main_queue進行繁重的計算,cuz界面繪圖出現在這個隊列中。 –

回答

3

這裏是一個遞歸=)的重載數據 - > itemAtIndex - >顯示 - >確實顯示

也許我失去了在這個週期的東西,但它並不重要。 reload data通話did display方法,並嘗試調用reload data方法did display方法=)

編輯

這個答案不更新的問題,更有效。

+0

非常感謝你的回答。對不起,需要改變你的回答無關緊要的問題。 –

相關問題