编辑:我承认我的设计有问题。只要把我的计时器移到一个无UI相关的功能上,问题就解决了。
首先,我有多个账户。我有一个collectionView来加载一个帐户的信息。
第二,我有两个功能。一个是我的收藏品视图的cellForItemAtIndexPath函数。我在里面有一个计时器来调用另一个函数来更新登录帐户的数据。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//updateUI methods..
if (// a rare situation ){
dispatch_async(dispatch_get_main_queue(), ^{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(refreshSingleVMStatusForTimer:)
userInfo:nil repeats:NO];
});
}
}下面是refreshSingleVMStatusForTimer函数,它可以从互联网下载所有数据,然后调用[collectionView reloadData]进行更新。
- (void) refreshSingleVMStatusForTimer :(NSTimer *) timer {
//download the data from internet
//parse the xml to useful data.
[collectionView reloadData];
}所以这两个函数变成了递归。
现在,如果我切换帐户,我的collectionView将在其中加载一个不同帐户的数据。但是递归仍然在运行,这将发生错误。
我不知道我是否清楚地解释了我的问题。如果你有什么问题,请告诉我。
发布于 2016-07-05 06:32:03
正如Avi所提到的,这是一个设计问题,它不允许您停止递归:您不应该在-cellForItem:atIndexPath:中触发重新加载。这是给园丁们做的。把它移开。
如果有理由在那里这样做,隔离它,并问一个新的Q。
发布于 2016-07-05 06:37:49
您需要确保“罕见情况”最终评估为false。如果这个值不改变,递归循环就永远不会中断。
https://stackoverflow.com/questions/38196327
复制相似问题