UITablevView的懒加载

UITablevView的懒加载时列表优化的最重要的方法之一,比如说今日头条就用了懒加载:快速滑动时,不加载图片,滑动将停止时才加载图片。


一、UITablevView的懒加载的原理:

1、当用户拖动tableview时,会加载cell中的图片。

2、当用户快速滑过tableview时不加载图片。

3、在tableview滑动即将结束时加载cell中的图片,这样就节省了下载图片和加载图片时的开销(多线程的开辟,内存的消耗 )。

上面的原理要求我们熟悉tableView的各种状态(拖动、滑动、减速、停止)等。我们知道UITableView继承自UIScrollView,而UIScrollView的各中状态我们时可以从它的代理方法中获得,从而也就获得了tableVew的各种状态,见:拖拽UIScrollView时的delegate调用调用顺序。

简单懒加载的核心代码:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    self.targetRect =nil;

   [selfloadVisibleCells];

}


- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inoutCGPoint *)targetContentOffset {

    CGRect targetRect = CGRectMake(targetContentOffset->x, targetContentOffset->y, scrollView.frame.size.width, scrollView.frame.size.height);

    self.targetRect = [NSValuevalueWithCGRect:targetRect];

}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    self.targetRect =nil;   

   [self loadVisibleCells];

}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *cellIdentifier =@"ImageCell";

    ImageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    

    if (!cell) {

        cell = [[[NSBundlemainBundle]loadNibNamed:@"ImageCell"owner:selfoptions:nil]firstObject];

    }


    [selfloadCell:cellwithIndexPath:indexPath];

}


- (void)loadCell:(ImageCell *)cell withIndexPath:(NSIndexPath *)indexPath {

     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];       

     CGRect cellFrame = [self.tableView rectForRowAtIndexPath:indexPath];

     if (self.targetRect && !CGRectIntersectsRect([self.targetRect CGRectValue], cellFrame)) {

        //[cell.bigImageView sd_setImageWithUR。。。加载图片

     }

}


- (void) loadVisibleCells {

    NSArray *cells = [self.tableViewvisibleCells];

    for (ImageCell *cellin cells) {


    }

}


二、懒加载存在的问题:

1 、我们虽然在减速过程中没有加载图片,但是显示的cell上依然有图片,这是怎么回事?我们知道tableView的cell是重用的,因为我们在滑动停止时才重新加载图片,所以减速过程中还是上次加载的图片。也就是经常说的图片的窜位问题(重用bug)。

2、上面的方案是拖动或滑动即将停止时再加载图片,在减速过程中即使图片缓存过了也不加载,这显然不合理。


三、进一步优化:

上面的两个问题归根到底是由于在滑动减速过程中没有对cell的图片做处理,也就是说我们可以在减速过程中,我们对已缓存过的图片也加载。

这就涉及到通过url判断图片是否已缓存,这个如果是手动缓存的话比较麻烦,但别忘了SDWebImage这个神器,它在图片的一步下载和缓存方面做的是非常出色的,对下载过的图片都会根据url自动缓存!所以通过下面的代码就可以得知图片是否有已缓存

SDWebImageManager *manager = [SDWebImageManagersharedManager];

SDImageCache *cache = [manager imageCache];

NSString *key = [managercacheKeyForURL:targetURL]; //targetURL就是需要加载的图片的URL的NSURL类型

if ([cache imageFromMemoryCacheForKey:key]) {

    //加载图片


也就是我们在减速的时候每次加载cell时,判断当前的cell中image图片的url和数据模型中的是否一样,不一样的话,就先隐藏cell的图片,然后根据url区加载缓存中的图片,如果加载到了,则显示图片,否则不做处理,这样就解决了窜位的问题。同时也解决了减速不加载已缓存的图片问题!核心代码:

    if (![[cell.photoViewsd_imageURL]isEqual:targetURL]) {

        cell.photoView.alpha =0.0;

        SDWebImageManager *manager = [SDWebImageManagersharedManager];

        CGRect cellFrame = [self.tableViewrectForRowAtIndexPath:indexPath];

        BOOL shouldLoadImage = YES;

        if (self.targetRect && !CGRectIntersectsRect([self.targetRectCGRectValue], cellFrame)) {  //判断是否在减速

            SDImageCache *cache = [manager imageCache];

            NSString *key = [manager cacheKeyForURL:targetURL];

            if (![cache imageFromMemoryCacheForKey:key]) {

                shouldLoadImage = NO;

            }

        }

    

        if (shouldLoadImage) {

            [cell.bigImageView sd_setImageWithURL:targetURLplaceholderImage:niloptions:SDWebImageHandleCookiescompleted:^(UIImage *image,NSError *error, SDImageCacheType cacheType,NSURL *imageURL) {

                if (!error && [imageURL isEqual:targetURL]) {

                    [UIViewanimateWithDuration:0.25animations:^{

                        cell.bigImageView.alpha =1.0;

                    }];

                }

            }];

       }

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值