2014-10-03 87 views
0

我有一個數組,集合視圖在創建單元格時使用數組中的數據。我在數組的開頭添加一些對象,當我的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不會改變,並且新的Section 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

你解決問題了嗎?我面對同一個。 – 2015-07-14 21:26:11

回答

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 
    }); 
}); 
+0

我試過調度,沒成功。同樣的方法,它將數據添加到數組的末尾(例如,在收集視圖的末尾添加部分)工作正常:( 我想它並沒有真正凍結,但是因爲我在插入新節後設置了內容偏移量,它會滾動回到原來的位置,它看起來像凍結。 – t0a0 2014-10-03 20:51:39

相關問題