首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保UITableView单元格中的远程获取图像始终是填充的?

如何确保UITableView单元格中的远程获取图像始终是填充的?
EN

Stack Overflow用户
提问于 2015-04-29 22:21:18
回答 2查看 57关注 0票数 1

我在求职面试中多次遇到这样的问题:你有一个UITableView,而用户的滚动速度非常快。您如何确保从服务器加载的所有单元图像在用户滚动到的任何位置都可见。

我可以想到几种技术。例如,我所做的是使用一个操作队列,加载了获取图像的请求,当用户开始滚动时,清空队列并在用户要去的任何地方填充图像请求。

另一种解决方案是用超低分辨率的缩略图填充图像,例如4点渐变,这样一些图像,尽管是坏的,在真实图像到达之前很久就存在了。

EN

回答 2

Stack Overflow用户

发布于 2015-04-29 22:51:23

我会说“清空队列,并在用户要去的任何地方用图像请求填充它”是使用indexPathsForVisibleRows的正确做法。但是,除非图像非常小,否则图像永远不会立即出现。

我认为他们的意思是在从后台线程下载后立即显示下载的图像,即:dispatch_get_main_queue()

在.h文件中:

代码语言:javascript
复制
@interface ViewController : UIViewController <UIScrollViewDelegate>

在.m文件中:

代码语言:javascript
复制
- (void)downloadVisibleRowImages
{
    NSArray *visibleRows = [self.tableView indexPathsForVisibleRows];

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        for (NSIndexPath *visibleRow in visibleRows) {
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: visibleRow];
            NSString *imageUrl = [_responseImages objectAtIndex:visibleRow.row];
            UIImage *image = nil; // Download image here
            dispatch_async(dispatch_get_main_queue(), ^{ // use main thread to display image immediately after download
                if (image) [cell.imageView setImage:image];
            });
        }
    });
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        [self downloadVisibleRowImages];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self downloadVisibleRowImages];
}
票数 0
EN

Stack Overflow用户

发布于 2015-04-29 22:57:11

我想说的是,这里的关键是“用户滚动到的位置”。因此,在知道哪些单元格将可见之前,您不应该开始下载图像。

所以我要做的就是观察UIScrollViewDelegate调用:

代码语言:javascript
复制
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

此时,使用以下命令使单元格可见:

代码语言:javascript
复制
- (NSArray *)indexPathsForVisibleRows

然后停止我的图片下载。把所有这些放在一起:

代码语言:javascript
复制
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSArray *theIndexPaths = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *theIndexPath in theIndexPaths) {
        SomeObject *myObject = self.listOfMyObjects[theIndexPath.row];
        [myObject downloadImage];
    }
}

这是非常基础的。显然需要更新单元格,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29946507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档