我有一个数组,集合视图在创建单元格时使用数组中的数据。我在数组的开头添加了一些对象,当我的collectionview几乎位于顶部时。我正在使用这种方法来确定是否有时间加载新商品和部分并添加它们
-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section < sectionLimitBeforeLoadingMoreSections)
{
// add some objects at the beginning of the array
}
}
但我可以轻松使用其他方法(例如scrollViewDidScroll)。
所以我有一个问题,当我将项目添加到数组和reloadData时,我的集合视图contentOffset不会被更改,因此一旦调用此方法,它就会被越来越多地调用,并使CPU无法工作@ 100%。
示例:我有20个部分,初始位置是中心部分(10)。我开始滚动到顶部,当我到达第4节时,10个项目被添加到数组中(这意味着将出现10个以上的部分)。因此,第4节现在必须成为第14节。所以它确实如此,但我的scrollView contentOffset没有改变,并且新的第4节立即可见,因此它再次调用此方法以再添加10个项目等等。
当我使用此方法在数组的末尾添加对象时,它工作正常。在底部添加了部分,我滚动得很好。
我想到了一个解决方案来确定添加的所有新部分的高度,并将此值添加到当前的contentOffset,但我不知道如何计算高度。
更新:
if(indexPath.section < sectionLimitBeforeLoadingMoreSections) // load @ beginning
{
if(!self.isLoading)
{
self.isLoading = YES;
CGFloat height = self.contentSize.height;
[self performBatchUpdates:^
{
[self loadNewMonthsAtTheBeginning:10];
[self insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)]];
}
completion:^(BOOL finished)
{
self.contentOffset = CGPointMake(self.contentOffset.x,self.contentOffset.y + self.contentSize.height - height);
self.isLoading = NO;
}];
}
}
似乎运行良好,但是在执行批处理时我会稍微冻结,有什么方法可以避免这种情况吗?
答案 0 :(得分:0)
如果你得到冻结,我会认为loadNewMonthsAtTheBeginning在主线程上使用了太多的处理时间,你应该考虑在另一个线程中执行那里完成的工作。
如果是网络连接,请考虑使用此处提到的异步调用:how to send Asynchronous URL Request?
否则你可以使用GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Code run on non UI thread to perform tasks such as loadNewMonthsAtTheBeginning
dispatch_async(dispatch_get_main_queue(), ^{
// UI thread to perform insertSections
});
});