`

iOS:转一个UITableView中异步加载图片方法

阅读更多

先说使用,再给定义

使用方法:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   
    static NSString *CellIdentifier = @"ImageCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   
    if (cell == nil) {
        cell = [[[UITableViewCell alloc]
                 initWithFrame:CGRectZero reuseIdentifier:CellIdentifier]
                autorelease];
    } else {
        AsyncImageView* oldImage = (AsyncImageView*)
        [cell.contentView viewWithTag:999];
        [oldImage removeFromSuperview];
    }
   
    CGRect frame;
    frame.size.width=75; frame.size.height=75;
    frame.origin.x=0; frame.origin.y=0;
    AsyncImageView* asyncImage = [[[AsyncImageView alloc]
                                   initWithFrame:frame] autorelease];
    asyncImage.tag = 999;
    NSURL *url = [NSURL URLWithString: @"image url"];

    [asyncImage loadImageFromURL:url];
    [cell.contentView addSubview:asyncImage];

    return cell;
}

 

类的定义:

.h

#import <UIKit/UIKit.h>


@interface AsyncImageView : UIView {
    //could instead be a subclass of UIImageView instead of UIView, depending on what other features you want to
    // to build into this class?
   
    NSURLConnection* connection; //keep a reference to the connection so we can cancel download in dealloc
    NSMutableData* data; //keep reference to the data so we can collect it as it downloads
    //but where is the UIImage reference? We keep it in self.subviews - no need to re-code what we have in the parent class
   
}

- (void)loadImageFromURL:(NSURL*)url;
- (UIImage*) image;
@end

 

.m

 

#import "AsyncImageView.h"

@implementation AsyncImageView

- (void)loadImageFromURL:(NSURL*)url {
    if (connection!=nil) { [connection release]; }
    if (data!=nil) { [data release]; }
    NSURLRequest* request = [NSURLRequest requestWithURL:url
                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:60.0];
    connection = [[NSURLConnection alloc]
                  initWithRequest:request delegate:self];
    //TODO error handling, what if connection is nil?
}

- (void)connection:(NSURLConnection *)theConnection
    didReceiveData:(NSData *)incrementalData {
    if (data==nil) {
        data =
        [[NSMutableData alloc] initWithCapacity:2048];
    }
    [data appendData:incrementalData];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
   
    [connection release];
    connection=nil;
   
    if ([[self subviews] count]>0) {
        [[[self subviews] objectAtIndex:0] removeFromSuperview];
    }
   
    UIImageView* imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];
   
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight );
   
    [self addSubview:imageView];
    imageView.frame = self.bounds;
    [imageView setNeedsLayout];
    [self setNeedsLayout];
    [data release];
    data=nil;
}

- (UIImage*) image {
    UIImageView* iv = [[self subviews] objectAtIndex:0];
    return [iv image];
}

- (void)dealloc {
    [connection cancel];
    [connection release];
    [data release];
    [super dealloc];
}

@end

 

原文地址:http://www.markj.net/iphone-asynchronous-table-image/

分享到:
评论

相关推荐

    iphone UITableView异步加载图片

    在iOS开发中,UITableView是一种常见的UI组件,用于展示大量数据列表。然而,当这个列表包含大量图片时,如果采用同步加载的方式...因此,理解并掌握iPhone UITableView异步加载图片的技术对于iOS开发者来说至关重要。

    uitableview异步加载图片(iOS)

    下面,我们来看一下如何使用SDWebImage进行UITableView的图片异步加载: 1. **安装SDWebImage**:可以使用CocoaPods或Swift Package Manager进行安装。例如,在Podfile中添加`pod 'SDWebImage'`,然后运行`pod ...

    uitableVIew异步加载图片

    在iOS开发中,`UITableView`是用于展示列表数据的关键组件,而异步加载图片是提高用户体验的重要技术。在用户滚动列表时,为了防止卡顿,我们通常不在主线程上加载图片,而是通过异步方式在后台线程处理。在描述中...

    ios tableview 异步 加载图片

    本文将详细探讨如何在UITableView中实现图片的异步加载。 一、异步加载的基本原理 异步加载是指在后台线程中执行耗时操作,避免阻塞主线程,确保用户界面的流畅性。在UITableView中,我们通常在cell的`...

    UITableView网络图片加载优化 延迟加载

    - 使用异步加载:避免阻塞主线程,保证用户界面的流畅性。 - 图片预加载:在用户滚动时,预先加载即将进入视口的图片,提供更好的用户体验。 - 错误处理:处理加载失败的情况,如显示占位图或者提供重试机制。 ...

    UITableView加载图片 官方范例

    2. **异步加载图片**:在UITableView中直接加载网络图片会严重影响滚动性能,因为这会导致大量的网络请求并发执行。为了解决这个问题,范例采用了异步加载策略,即在后台线程下载图片,避免了UI卡顿。此外,为了...

    ios-异步加载网络图片到视图上,并且实现内存中的缓存.zip

    在iOS开发中,异步加载网络图片到视图上是一个常见的需求,特别是在处理大量图片的列表展示时。这个压缩包“ios-异步加载网络图片到视图上,并且实现内存中的缓存.zip”显然是一个示例项目,旨在教授如何在iOS应用中...

    iOS 图片异步加载 图片缓存

    在iOS开发中,图片异步加载和图片缓存是提高应用性能和用户体验的关键技术。这两个概念密切相关,因为异步加载可以防止UI阻塞,而缓存则可以减少网络请求,加速图片显示。以下是对这两个主题的详细解释: **图片...

    UITableView的带有图片

    在iOS开发中,UITableView是一个非常重要的组件,它用于展示数据列表。这个压缩包中的"UITableView的带有图片"可能是一个示例项目,展示了如何在UITableView中集成图片。在iOS应用中,图片的展示不仅可以增加视觉...

    异步加载图片显示到控件上

    在实际项目中,你可能需要在列表(RecyclerView、UITableView)中异步加载大量图片,这时需注意避免内存泄漏,合理管理图片资源。 通过以上讲解,你应该了解了异步加载图片的基本原理和实践方法。实际应用中,还...

    ios iphone异步加载图片EGOTableViewPullRefresh

    EGOTableViewPullRefresh 是一个优秀的开源库,它专门针对UITableView进行了优化,实现了下拉刷新功能,并且支持异步加载图片,极大地提高了图片加载速度。这个库对于那些需要展示大量网络图片,如新闻、社交媒体...

    IPhone TableView 图片异步加载

    3. **AsyncImageView.h/m**:这是一个自定义的图片视图,它扩展了 `UIImageView`,并实现了异步加载图片的功能。在 `UITableView` 的每个单元格中,我们通常会使用这种视图来显示图片。它会在后台线程中加载图片,并...

    IOS UITableView及索引条源码

    在实际开发中,我们还需要关注性能优化,比如正确复用cell,避免在`tableView:cellForRowAtIndexPath:`中执行耗时操作,以及合理利用异步加载数据以提高用户体验。 总结起来,理解并熟练掌握UITableView的使用,...

    异步加载和缓存

    在iOS开发中,异步加载和缓存是两个至关重要的概念,特别是在处理大量数据和多媒体内容时,如在UITableView或UICollectionView中显示图片。这两个技术能够显著提升应用性能,提高用户体验,同时节省系统资源。 首先...

    UITableView实现对图片的展示

    本教程将详细介绍如何利用UITableView来实现图片的展示,特别是在一个单元格中显示多张图片。我们将主要涉及以下三个关键技术:UITableView、UIImageView和UIImage。 首先,我们需要了解UITableView的基础知识。...

    IOS从网络上加载一系列的图片并显示在tableview上的例子

    5. **异步加载**:SDWebImage库的一个核心特性是支持异步加载图片,这意味着图片的下载不会阻塞主线程,保证了用户界面的流畅性。图片加载在后台线程完成,完成后会通过回调在主线程中更新UI。 6. **图片占位符**:...

    iOS UItableView

    在iOS开发中,UITableView是构建用户界面的重要组件,它用于展示列表或表格数据。...在实际开发中,还需要注意性能优化,比如使用异步加载数据,以及在用户输入时避免不必要的数据刷新,以确保应用的流畅性。

    iOS开发中UITableview控件的基本使用及性能优化方法

    2. **异步加载图片**:避免在主线程中加载图片,可以使用第三方库如SDWebImage进行异步加载,减少阻塞UI。 3. **懒加载**:只在Cell即将显示时才加载对应的数据,避免一次性加载大量数据。 4. **自适应Cell高度**:...

    IOS UITableView上拉刷新和下拉加载

    2. **创建UITableView**:在你的`UIViewController`或`UITableViewController`中,你需要初始化并设置一个`UITableView`,包括它的代理和数据源。 ```swift let tableView = UITableView(frame: view.bounds, style...

Global site tag (gtag.js) - Google Analytics