从collectionView :: didEndDisplayingCell调用reloadData。它会导致应用程序冻结。为什么?

时间:2014-03-03 12:15:19

标签: objective-c uicollectionview

这是我的pseduo代码:

- (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 App似乎被冻结。为什么呢?

修改

根据Oleg Sobolev的回答,我重构了代码,发现问题与递归无关。正如您在示例代码中所看到的那样,viewB正在进行重新加载调用。此didEndDisplayingCell内的viewA不受影响。

发生的事情是我在代码中有一个while循环(未显示),为viewB准备一组新数据。退出条件写得很差。

但是,如果递归是一个问题,我仍然希望看到一个可能的解决方案。

1 个答案:

答案 0 :(得分:3)

这是递归=)重新加载数据 - > itemAtIndex - >将显示 - >确实显示了

也许我在这个循环中失去了一些东西,但这并不重要。 reload data调用did display方法,您尝试在reload data方法=)中调用did display方法

修改

此答案对更新的问题不再有效。