【问题标题】:Async Images Download in a Table表格中的异步图像下载
【发布时间】:2011-07-25 18:20:25
【问题描述】:

我有一个表格视图,我想将一个图标图像 (100x75) 异步下载到每一行。到目前为止,我已经遵循了许多教程,但我似乎无法弄清楚。我该怎么做?

是否有人建议只使用标准的 NSURLConnection API 来执行此操作,还是我应该使用在线可用的类/库之一来执行此操作?如果有,你有什么推荐的?

当然,我需要它快速、高效且不泄漏。我也不希望下载影响滚动。

谢谢!

【问题讨论】:

    标签: iphone objective-c uitableview asynchronous nsurlconnection


    【解决方案1】:

    我能想到的两个选项:

    (1) 使用ASIHTTPRequest

    (2) 生成一个线程的自定义实现,您可以在其中使用NSURL/NSData 的组合加载图像。加载图像后,使用 performSelectorOnMainThread:withObject: 将其发送到主 UI 线程上的方法。

    NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(loadImage:) object:nil];
    [t start];
    [t release];
    
    -(void) updateImage:(id) obj {
      // do whatever you need to do
    }
    
    -(void) loadImage:(id) obj {
    
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
      NSURL *url = [NSURL URLWithString:@"imageurl"];
      NSData *imageData = [[NSData alloc]initWithContentsOfURL:url]; 
      UIImage *image = [UIImage imageWithData:imageData];
      [imageData release];
    
      [self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];  
      [pool release];
    
    }
    

    【讨论】:

    • 我认为表格中的图像线程不是一个好主意。至于 ASIHTTPRequest,我将它用于我的应用程序中的其他事情 - 但是您如何有效地将它用于表格视图中的图像?对此不确定 - 尝试阅读 kosmaczewski.net/2009/03/08/... 但他的应用程序在我运行时无法运行,并且它使用的核心动画对于我的需要来说太复杂了。解码他的密码会花费我更多的时间。
    • @Nayefc - 你有什么顾虑?我没有使用 ASIHTTPRequest,也没有查看它的源代码,但如果它没有启动某种后台线程来异步加载资源,我会感到惊讶。
    • 我不完全确定如何使用 ASIHTTPRequest(或精确的方法)在表格视图中实现我想要的。我知道如何在没有表格的情况下使用它,但是表格(带有滚动)会使事情变得更加棘手。
    【解决方案2】:

    我建议您使用 ASIHTTPRequest。它简单而且相当快。
    这是文档的链接 - ASIHTTPRequest

    编辑

    您只需下载可见单元格的图像。 这是一个示例:

    - (void)loadContentForVisibleCells
    {
        NSArray *cells = [self.tableView visibleCells];
        [cells retain];
        for (int i = 0; i < [cells count]; i++) 
        { 
            ...
            // Request should be here
            ...
        }
        [cells release];
    }
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
    {
        if (!decelerate) 
        {
            [self loadContentForVisibleCells]; 
        }
    }
    

    无论如何,您都需要编写大量代码才能使事情顺利且快速地运行。

    【讨论】:

    • 是的,我在我的应用程序中将 ASIHTTPRequest 用于其他事情 - 但是您如何有效地将它用于表格视图中的图像?对此不确定 - 尝试阅读 kosmaczewski.net/2009/03/08/… 但他的应用程序在我运行它时不起作用,并且它使用的核心动画对于我的需要来说太复杂了。解码他的密码会花费我更多的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多