這裏是我的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
準備一組新數據。退出條件寫得很糟糕。
但是,如果遞歸是一個問題,我仍然希望看到一個可能的解決方案。
我沒有回答你的問題?您只需在視圖控制器的生命週期中進行遞歸。 –
對不起,我找到了一個根本原因,它與遞歸調用無關。我將在問題 –
中記下更多詳細信息。此函數將調用您的collectionView中的每個**項目。我認爲問題是viewA中有很多項目。所以,你有沉重的計算。你不應該使用main_queue進行繁重的計算,cuz界面繪圖出現在這個隊列中。 –