先说使用,再给定义
使用方法:
- (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/
相关推荐
在iOS开发中,UITableView是一种常见的UI组件,用于展示大量数据列表。然而,当这个列表包含大量图片时,如果采用同步加载的方式...因此,理解并掌握iPhone UITableView异步加载图片的技术对于iOS开发者来说至关重要。
下面,我们来看一下如何使用SDWebImage进行UITableView的图片异步加载: 1. **安装SDWebImage**:可以使用CocoaPods或Swift Package Manager进行安装。例如,在Podfile中添加`pod 'SDWebImage'`,然后运行`pod ...
在iOS开发中,`UITableView`是用于展示列表数据的关键组件,而异步加载图片是提高用户体验的重要技术。在用户滚动列表时,为了防止卡顿,我们通常不在主线程上加载图片,而是通过异步方式在后台线程处理。在描述中...
本文将详细探讨如何在UITableView中实现图片的异步加载。 一、异步加载的基本原理 异步加载是指在后台线程中执行耗时操作,避免阻塞主线程,确保用户界面的流畅性。在UITableView中,我们通常在cell的`...
- 使用异步加载:避免阻塞主线程,保证用户界面的流畅性。 - 图片预加载:在用户滚动时,预先加载即将进入视口的图片,提供更好的用户体验。 - 错误处理:处理加载失败的情况,如显示占位图或者提供重试机制。 ...
2. **异步加载图片**:在UITableView中直接加载网络图片会严重影响滚动性能,因为这会导致大量的网络请求并发执行。为了解决这个问题,范例采用了异步加载策略,即在后台线程下载图片,避免了UI卡顿。此外,为了...
在iOS开发中,异步加载网络图片到视图上是一个常见的需求,特别是在处理大量图片的列表展示时。这个压缩包“ios-异步加载网络图片到视图上,并且实现内存中的缓存.zip”显然是一个示例项目,旨在教授如何在iOS应用中...
在iOS开发中,图片异步加载和图片缓存是提高应用性能和用户体验的关键技术。这两个概念密切相关,因为异步加载可以防止UI阻塞,而缓存则可以减少网络请求,加速图片显示。以下是对这两个主题的详细解释: **图片...
在iOS开发中,UITableView是一个非常重要的组件,它用于展示数据列表。这个压缩包中的"UITableView的带有图片"可能是一个示例项目,展示了如何在UITableView中集成图片。在iOS应用中,图片的展示不仅可以增加视觉...
在实际项目中,你可能需要在列表(RecyclerView、UITableView)中异步加载大量图片,这时需注意避免内存泄漏,合理管理图片资源。 通过以上讲解,你应该了解了异步加载图片的基本原理和实践方法。实际应用中,还...
EGOTableViewPullRefresh 是一个优秀的开源库,它专门针对UITableView进行了优化,实现了下拉刷新功能,并且支持异步加载图片,极大地提高了图片加载速度。这个库对于那些需要展示大量网络图片,如新闻、社交媒体...
3. **AsyncImageView.h/m**:这是一个自定义的图片视图,它扩展了 `UIImageView`,并实现了异步加载图片的功能。在 `UITableView` 的每个单元格中,我们通常会使用这种视图来显示图片。它会在后台线程中加载图片,并...
在实际开发中,我们还需要关注性能优化,比如正确复用cell,避免在`tableView:cellForRowAtIndexPath:`中执行耗时操作,以及合理利用异步加载数据以提高用户体验。 总结起来,理解并熟练掌握UITableView的使用,...
在iOS开发中,异步加载和缓存是两个至关重要的概念,特别是在处理大量数据和多媒体内容时,如在UITableView或UICollectionView中显示图片。这两个技术能够显著提升应用性能,提高用户体验,同时节省系统资源。 首先...
本教程将详细介绍如何利用UITableView来实现图片的展示,特别是在一个单元格中显示多张图片。我们将主要涉及以下三个关键技术:UITableView、UIImageView和UIImage。 首先,我们需要了解UITableView的基础知识。...
5. **异步加载**:SDWebImage库的一个核心特性是支持异步加载图片,这意味着图片的下载不会阻塞主线程,保证了用户界面的流畅性。图片加载在后台线程完成,完成后会通过回调在主线程中更新UI。 6. **图片占位符**:...
在iOS开发中,UITableView是构建用户界面的重要组件,它用于展示列表或表格数据。...在实际开发中,还需要注意性能优化,比如使用异步加载数据,以及在用户输入时避免不必要的数据刷新,以确保应用的流畅性。
2. **异步加载图片**:避免在主线程中加载图片,可以使用第三方库如SDWebImage进行异步加载,减少阻塞UI。 3. **懒加载**:只在Cell即将显示时才加载对应的数据,避免一次性加载大量数据。 4. **自适应Cell高度**:...
2. **创建UITableView**:在你的`UIViewController`或`UITableViewController`中,你需要初始化并设置一个`UITableView`,包括它的代理和数据源。 ```swift let tableView = UITableView(frame: view.bounds, style...