2

我必须下载 20-25 个 50 Kb- 2 Mb 的图像,并在表格视图中显示它们。我对此使用了 ASIHTTPRequest 异步请求。我观察到一段时间后应用程序卡住了。这不应该发生,因为我正在使用异步调用。我认为 ASIHTTPRequest 有问题,我观察到 didFinished 选择器在主线程中被调用。我唯一要做的就是

-(void)didFinishedDownloadingImage:(ASIHTTPRequest*)request
{
    NSData *responseData = [请求响应数据];
    UIImage *image = [UIImage imageWithData:responseData];
    [[data objectAtIndex:request.tag] setImage:image];
    [self.tableView reloadData];
}

我认为这不会造成任何问题。同样在 cellforrowatindexpath 我只是做

- (UItableViewCell *)tableviewView:(UItableView *)tableview
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UserProfile * 用户 = [数据 objectAtIndex:indexpath.row];

    UITableViewCell *cell = [tableView
                              dequeueReusableCellWithReuseIdentifier:@"ProfileCell"
                              forIndexPath:indexPath];
    如果(细胞 == 零){
        单元格 = [[UITableViewCell alloc] initWithStyle:UITableViewDefaultStyle];
    }

    NSString *fullname = [NSString stringWithFormat:@"%@\n%@",
                                    用户名,用户名,用户名];
    if(user.image != nil)
        [cell.imageView setImage:user.image];
    别的{
        [cell.imageView setImage:[UIImage imageNamed:@"placeholder.jpg"]];
    }    
    [cell.label setText:fullname];
    返回单元格;
}

但是该应用程序很慢并且冻结了 1-2 秒,这是相当长的时间。我见过可以非常顺利地执行此操作的应用程序。我尝试使用固定大小的 5Kb 图像,使用上述代码可以显着提高性能。我不知道为什么在这种情况下这会对大图像产生影响,因为所有下载都是通过 ASIHTTP 在其他线程中发生的。

4

2 回答 2

2

请用AFNetworking替换您的框架。

你可以简单的使用..

IImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];

或者...直接在 TableViewCell

NSURL *url = [[NSURL alloc] initWithString:[movie objectForKey:@"artworkUrl100"]];
[cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];

“在第二行中,我们通过传递一个 NSURL 告诉图像视图缩略图所在的位置,并且我们传入一个占位符图像,只要我们的请求没有返回响应,就会显示该图像”

就这样!

在这里你有一个关于http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_afnetworking/的教程

于 2013-01-17T10:56:57.840 回答
1

很容易对滞后/缓慢的应用程序的根本原因做出假设。与其猜测,不如测试你的怀疑?使用 Time Profiler 工具分析您的应用程序。它会告诉您应用程序花费最多时间的方法和功能。

在您有机会介绍之前,这里有一些想法:

您可以考虑下载全分辨率图像并在后台创建缩略图,然后将它们缓存在一个NSCache对象中。您也可以[UIImage imageWithData:responseData];在后台线程中运行。在它与视图层次结构交互之前,它是线程安全的。

有选择地重新加载单个单元格应该比重新加载整个 tableview 更快,尤其是一个有很多图像的单元格。此外,如果您在后台队列上进行所有的网络连接和处理,那么滚动表格视图没有理由变慢。-cellForRowAtIndexPath:您能向我们展示您对该方法的整个实现吗?你提到你认为setImage:是你的慢点,因为渲染很慢。如果重新加载单个单元格,则只需要渲染一个单元格。如果重新加载整个 tableview,则必须重新渲染每个单元格。

于 2013-01-17T19:42:45.207 回答