Objective c 从collectionView::DiEndDisplayingCell调用了重新加载数据。它会导致应用程序冻结。为什么?
这是我的PSEDOO代码: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.
- (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
calldid display
method,您尝试在did display
method=)中调用reload data
method)
编辑
此答案对于更新的问题无效。这里是一个递归=)重新加载数据->项目索引->将显示->已显示
也许我在这个循环中失去了一些东西,但这并不重要reload data
calldid display
method,您尝试在did display
method=)中调用reload data
method)
编辑
此答案对于更新的问题无效。这里是一个递归=)重新加载数据->项目索引->将显示->已显示
也许我在这个循环中失去了一些东西,但这并不重要reload data
calldid display
method,您尝试在did display
method=)中调用reload data
method)
编辑
此答案对于更新的问题无效。这里是一个递归=)重新加载数据->项目索引->将显示->已显示
也许我在这个循环中失去了一些东西,但这并不重要reload data
calldid 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是否被视为后台队列?非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉需要更改问题,使您的答案变得无关紧要。非常感谢您的回答。很抱歉,需要更改问题,使您的答案变得无关紧要。