首页 文章

在iOS上,如何避免在具有固定或可变行数的UITableView中重新获取图像?

提问于
浏览
0

如果我们从Internet获取一个小图像(例如,60 x 60),在方法内部:

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

如果长度可以变化(例如,100,或者可以是1000),那么如果有固定的25行数,该怎么办?如果我们使用 dequeueReusableCellWithIdentifier 到"reuse"一个单元格,我们可能需要删除此单元格中的子视图(其中一个是60 x 60图像),因此当用户向上和向下滚动列表时,单元格将被重用,并且从网络中重新获取图像,并且可以在滚动时在这里和那里暂停 .

但是,如果我删除 dequeueReusableCellWithIdentifier 并始终分配一个新单元格:

cell = [[UITableViewCell alloc] 
               initWithStyle:UITableViewCellStyleDefault
               reuseIdentifier:TableViewCellIdentifier];

然后当我再次向下滚动时, NSLog 显示图像仍在被提取 . 有没有办法防止这种情况,如果我们不想单独使用数组存储获取的图像?

(现在,行为最初是提取大约7个图像,如果表格向下滚动3行,则提取3个图像,如果表格向上滚动3行,则再次提取3个图像)

5 回答

  • 1

    你应该有一个图像缓存机制 . 如果图像不存在,请下载该图像 . 设置到期时您需要重新获取它 . 然后显示它 .

    下次加载它 . 您显示已下载的图像并检查到期日期 . 如果已过期,请再次下载,然后更新显示 .

    很简单 .

    只有复杂的是,下载后应该覆盖图像 . 我用GUID测试了这个 . 当请求图像下载时,我在表视图或图像对象本身中放置了一个UUID . 我还将UUID与下载任务一起发送 . 当下载返回时,您将根据显示项目的UUID测试下载的UUID . 如果他们是平等的 . 然后你更新显示 . 如果他们已经改变,那么请求另一次下载并覆盖你的 . 因此,该过程改变了图像,并且很快就会完成具有该UUID的下载,并将使用其下载的内容更改图像 .

    希望有所帮助:)

  • 1

    你可以使用图像缓存,正如Volure所说 . 我还建议你为这些图像实现某种形式的延迟加载 . 有许多不同的实现 . This project是UIImageView的子类,支持异步加载 .

    另外,看看this question,答案可能会有所帮助 .

    希望这可以帮助 .

  • 0

    至于暂停您的图片的滚动视图应加载您的图像(如果它们没有缓存或需要根据DarkAngel 's answer) on another thread. I'进行更新,请使用NSOperationQueue . Here's a good tutorial设置NSOperationQueue . 一个好主意是在您的app委托中使用共享队列可以在需要时添加任务 .

  • 2

    只需使用SDWebImage或AFNetworking . 它们都提供了一个UIImageView类,为您提供缓存机制 .

    这意味着如果图像下载程序库(SDWebImage或AFNetworking)在其缓存中找到了一个图像,那么它将从磁盘中获取该图像而不是从Web重新下载图像 .

    您可能会发现延迟很可能是因为在您的cellForRowAtIndexPath:表视图委托方法中,您可能正在主线程上使用NSURLConnection下载缩略图图像 .

    SDWebImage或AFNetworking将基本上为您完成所有艰苦的工作,并使您的表响应 . 你所要做的就是:

    [myThumbnailImageView imageWithURL:imageURL placeholder:[UIImage imageNamed:@"myPlaceholderImage.png"]];
    

    一旦你在那里得到那条线,那就是它 . 下载后,您的真实图像将会出现,直到您可以继续平滑滚动表格视图 . 当未下载图像时,每个单元格将显示您指定的占位符图像(请参阅上面的代码行) .

  • 1

    为了更方便下载图像,请使用EGOImageLoader / EGOImageView通过此链接https://github.com/enormego/EGOImageLoading下载此课程 .

    从这个EGOCache用于存储您的图像 . 第一次下载时,在滚动UITableview时从EGOCache商店获取图像 . 在该类中,它使用键存储Downloaded映像 . 关键是imageUrl的散列值 . 使用相同的密钥从缓存中检索图像 . Tamilarasan

相关问题