Objective c 从collectionView::DiEndDisplayingCell调用了重新加载数据。它会导致应用程序冻结。为什么?

Objective c 从collectionView::DiEndDisplayingCell调用了重新加载数据。它会导致应用程序冻结。为什么?,objective-c,uicollectionview,Objective C,Uicollectionview,这是我的PSEDOO代码: - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"didEndDisplayingCell %@", indexPath ); if (collectionView == self.

这是我的PSEDOO代码:

- (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应用程序似乎已冻结。为什么?

编辑

根据Oleg Sobolev的回答,我重构了代码,发现问题与递归无关。正如您在关于的示例代码中所看到的,它是
viewB
获取重新加载调用。此
DiEndDisplayingCell
内的视图A不受影响

发生的情况是,我在代码(未显示)中有一个
while
循环,为
视图b
准备一组新数据。退出条件写得不好

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

这里是一个递归=)重新加载数据->项目索引->将显示->已显示

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

编辑

此答案对于更新的问题无效。

这里是一个递归=)重新加载数据->项目索引->将显示->已显示

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

编辑

此答案对于更新的问题无效。

这里是一个递归=)重新加载数据->项目索引->将显示->已显示

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

编辑

此答案对于更新的问题无效。

这里是一个递归=)重新加载数据->项目索引->将显示->已显示

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

编辑



此答案对于更新的问题无效。

我确实回答了您的问题吗?您只是在视图控制器的生命周期中进行递归。对不起,我找到了一个根本原因,它与递归调用无关。我将在问题中列出更多细节。此函数将为collectionView中的每个项目调用。我认为问题在于viewA中有很多项。所以,你的计算能力很强。您不应该使用main_队列进行繁重的计算,因为此队列中出现了接口绘图。请尝试使用后台队列。dispatch_async是否被视为后台队列?我确实回答了您的问题?您只是在视图控制器的生命周期中进行递归。对不起,我找到了一个根本原因,它与递归调用无关。我将在问题中列出更多细节。此函数将为collectionView中的每个项目调用。我认为问题在于viewA中有很多项。所以,你的计算能力很强。您不应该使用main_队列进行繁重的计算,因为此队列中出现了接口绘图。请尝试使用后台队列。dispatch_async是否被视为后台队列?我确实回答了您的问题?您只是在视图控制器的生命周期中进行递归。对不起,我找到了一个根本原因,它与递归调用无关。我将在问题中列出更多细节。此函数将为collectionView中的每个项目调用。我认为问题在于viewA中有很多项。所以,你的计算能力很强。您不应该使用main_队列进行繁重的计算,因为此队列中出现了接口绘图。请尝试使用后台队列。dispatch_async是否被视为后台队列?我确实回答了您的问题?您只是在视图控制器的生命周期中进行递归。对不起,我找到了一个根本原因,它与递归调用无关。我将在问题中列出更多细节。此函数将为collectionView中的每个项目调用。我认为问题在于viewA中有很多项。所以,你的计算能力很强。您不应该使用main_队列进行繁重的计算,因为在此队列中会绘制接口。请尝试使用后台队列。dispatch_async是否被视为后台队列?非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉,需要更改问题,使您的答案变得无关紧要。