iOS开发之异步加载图片

来源:互联网 发布:如何下载淘宝卖家版 编辑:程序博客网 时间:2024/05/16 12:20

比较原始的方法:

AsyncImageView.h:

#import <UIKit/UIKit.h>

@interface AsyncImageView : UIView

{

    NSURLConnection* connection;

    NSMutableData* data;

}

- (void)loadImageFromURL:(NSURL*)url;

@end

AsyncImageView.m:

#import "AsyncImageView.h"

@implementation AsyncImageView

  

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if(self) {

        // Initialization code

    }

    returnself;

}

  

- (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];

}

  

- (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

使用:

AsyncImageView *asyncImage = [[AsyncImageView alloc] init];

asyncImage.frame = CGRectMake(100, point_y, 95, 95)

//圆角

[asyncImage.layer setMasksToBounds:YES];

[asyncImage.layer setCornerRadius:15];

[asyncImage loadImageFromURL:[NSURL URLWithString:@"www.istar.name/...."]];

不过发现一个好东东, SDWebImage, 这个实在是太方便了
主页:https://github.com/rs/SDWebImage
1.下载下来放到project里面
2. 添加:MapKit.framework
3. #import “UIImageView+WebCache.h”
4. 使用:

UIImageView *asyncImage = [[UIImageView alloc] init];

[asyncImage setImageWithURL:[NSURL URLWithString:@www.istar.name/....]];

 

使用第三方库


EGOImageLoading是我在项目中用的比较多的一个第三方图片异步加载类,你们可以在git上找到并下载它,链接如下。另外提一下,
广为人知的下拉刷新EGORefreshTableHeaderView也是就是这个人写的。

https://github.com/enormego/EGOImageLoading
(下载后运行demo程序XCode会提示找不到EGOCache.h头文件,可以在这个地方下载https://github.com/enormego/EGOCache)

使用方法可以参照里面的demo程序,很简单,只要把ImageUrl告诉它,剩下的就什么都不用管了,它会帮你异步加载,还会做缓存处理...

?1234     // 设置默认占位图片     myEgoimageView.placeholderImage = [UIImage imageNamed:@"placeholder.png"];     // 告诉它图片的url地址, done     myEgoimageView.imageURL = [NSURL URLWithString:@"http://simg.cocoachina.com/201111220746561330.jpg"];

0 0