``` 有时候我们需要在 TableView CollectionView 这样的控件滚动之前就想要加载一些东西 我这里做的是加载图片

我们想在当前的这些可见Cell前几个 或者后几个 的数据提前加载 这个时候就可以用到一下代码 OC的直接拷贝 我这里举例的是CollectionView 你只要把 CollectionView相关的数据源代码 换成 TableView的就可以了 获取算法还是一样的

// 停止滚动

  • (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView

{

// if decelerate was true for scrollViewDidEndDragging:willDecelerate:

// this will be called when the deceleration is done

[selfprefetchImagesForCollectionView:self.collectionView];

}

// 停止拖拽

  • (void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate

{

// if decelerate is true, then we shouldn't start prefetching yet, because

// cellForRowAtIndexPath will be hard at work returning cells for the currently visible

// cells.

if(!decelerate){

[selfprefetchImagesForCollectionView:self.collectionView];

}

}

/** Prefetch a certain number of images for rows prior to and subsequent to the currently visible cells

  • @param tableView The tableview for which we're going to prefetch images.

*/

  • (void)prefetchImagesForCollectionView:(SMCollectionView*)collectionView

{

NSArray*indexPaths = [collectionViewindexPathsForVisibleItems];

if([indexPathscount] ==0)return;

NSIndexPath*minimumIndexPath = indexPaths[0];

NSIndexPath*maximumIndexPath = [indexPathslastObject];

// they should be sorted already, but if not, update min and max accordingly

for(NSIndexPath*indexPathinindexPaths)

{

if(indexPath.section< minimumIndexPath.section|| (indexPath.section== minimumIndexPath.section&& indexPath.row< minimumIndexPath.row)) minimumIndexPath = indexPath;

if(indexPath.section> maximumIndexPath.section|| (indexPath.section== maximumIndexPath.section&& indexPath.row> maximumIndexPath.row)) maximumIndexPath = indexPath;

}

// build array of imageURLs for cells to prefetch

NSMutableArray*imageURLs = [NSMutableArrayarray];

indexPaths =[selfcollectionView:collectionViewpriorIndexPathCount:kPrefetchRowCountfromIndexPath:minimumIndexPath];

for(NSIndexPath*indexPathinindexPaths) {

[imageURLsaddObject:[selfurlForIndexPath:indexPath]];

}

indexPaths = [selfcollectionView:collectionViewnextIndexPathCount:kPrefetchRowCountfromIndexPath:maximumIndexPath];

for(NSIndexPath*indexPathinindexPaths) {

[imageURLsaddObject:[selfurlForIndexPath:indexPath]];

}

// now prefetch

if([imageURLscount] >0)

{

[[SDWebImagePrefetchersharedImagePrefetcher]prefetchURLs:imageURLs];

}

}

/** Retrieve NSIndexPath for a certain number of rows preceding particular NSIndexPath in the table view.

*

  • @param tableView The tableview for which we're going to retrieve indexPaths.

  • @param countThe number of rows to retrieve

  • @param indexPath The indexPath where we're going to start (presumably the first visible indexPath)

*

  • @returnAn array of indexPaths.

*/

  • (NSArray)collectionView:(SMCollectionView)collectionView priorIndexPathCount:(NSInteger)count fromIndexPath:(NSIndexPath*)indexPath

{

NSMutableArray*indexPaths = [NSMutableArrayarray];

NSIntegerrow = indexPath.row;

NSIntegersection = indexPath.section;

for(NSIntegeri =0; i < count; i++) {

if(row ==0) {

if(section ==0) {

returnindexPaths;

}else{

section--;

row = [collectionViewnumberOfItemsInSection:section] -1;

}

}else{

row--;

}

[indexPathsaddObject:[NSIndexPathindexPathForRow:rowinSection:section]];

}

returnindexPaths;

}

/** Retrieve NSIndexPath for a certain number of following particular NSIndexPath in the table view.

*

  • @param tableView The tableview for which we're going to retrieve indexPaths.

  • @param countThe number of rows to retrieve

  • @param indexPath The indexPath where we're going to start (presumably the last visible indexPath)

*

  • @returnAn array of indexPaths.

*/

  • (NSArray)collectionView:(SMCollectionView)collectionView nextIndexPathCount:(NSInteger)count fromIndexPath:(NSIndexPath*)indexPath

{

NSMutableArray*indexPaths = [NSMutableArrayarray];

NSIntegerrow = indexPath.row;

NSIntegersection = indexPath.section;

NSIntegerrowCountForSection = [collectionViewnumberOfItemsInSection:section];

for(NSIntegeri =0; i < count; i++) {

row++;

if(row == rowCountForSection) {

row =0;

section++;

if(section == [collectionViewnumberOfSections]) {

returnindexPaths;

}

rowCountForSection = [collectionViewnumberOfItemsInSection:section];

}

[indexPathsaddObject:[NSIndexPathindexPathForRow:rowinSection:section]];

}

returnindexPaths;

}

/**

*获取当前indexPath的ImageUrl

*

*@param indexPath indexPath description

*

*@return IamgeURL

*/

  • (NSString)urlForIndexPath:(NSIndexPath)indexPath {

SMReadModel*readModel =self.dataArray[indexPath.section];

SMReadCartoonModel*readCartoonModel = readModel.readCartoonModels[indexPath.item];

returnreadCartoonModel.images;

}

```

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐