iphone开发——很好的延迟加载图像的想法

//  AsyncImageView.m
//  Postcard
//
//  Created by markj on 2/18/09.
//  Copyright 2009 Mark Johnson. You have permission to copy parts of this code into your own projects for any use.
//  www.markj.net
//


#import "AsyncImageView.h"




// This class demonstrates how the URL loading system can be used to make a UIView subclass
// that can download and display an image asynchronously so that the app doesn't block or freeze
// while the image is downloading. It works fine in a UITableView or other cases where there
// are multiple images being downloaded and displayed all at the same time. 


@implementation AsyncImageView


- (void)dealloc {
 [connection cancel]; //in case the URL is still downloading
 [connection release];
 [data release]; 
    [super dealloc];
}




- (void)loadImageFromURL:(NSURL*)url {
 if (connection!=nil) { [connection release]; } //in case we are downloading a 2nd image
 if (data!=nil) { [data release]; }
 
 NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
 connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; //notice how delegate set to self object
 //TODO error handling, what if connection is nil?
}




//the URL connection calls this repeatedly as data arrives
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {
 if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:2048]; } 
 [data appendData:incrementalData];
}


//the URL connection calls this once all the data has downloaded
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
 //so self data now has the complete image 
 [connection release];
 connection=nil;
 if ([[self subviews] count]>0) {
  //then this must be another image, the old one is still in subviews
  [[[self subviews] objectAtIndex:0] removeFromSuperview]; //so remove it (releases it also)
 }
 
 //make an image view for the image
 UIImageView* imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];
 //make sizing choices based on your needs, experiment with these. maybe not all the calls below are needed.
 imageView.contentMode = UIViewContentModeScaleAspectFit;
 imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight );
 [self addSubview:imageView];
 imageView.frame = self.bounds;
 [imageView setNeedsLayout];
 [self setNeedsLayout];


 [data release]; //don't need this any more, its in the UIImageView now
 data=nil;
}


//just in case you want to get the image directly, here it is in subviews
- (UIImage*) image {
 UIImageView* iv = [[self subviews] objectAtIndex:0];
 return [iv image];
}


@end>




附: 想法在项目的实现:点击打开链接



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值