MBProgressHUD多线程加载图片

本文原创,转载请注明出处!

冻死我了,没钱吃饭了,作为猪来说我鸭梨巨大。饥寒交迫的我为了大家能够更好地学习,苦命地写博客。

下面为大家呈上MBProgressHUD的两种图片加载提示效果,一种是在一个线程里加载,另一种是开一个线程加载,并使用MBProgressHUD作为等待的提示框,下面请看效果图:

在使用之前请先下载MBProgressHUD类,下载地址是: http://github.com/matej/MBProgressHUD      下载完直接把MBProgressHUD.hMBProgressHUD.m两个文件拖到项目中

第一种方式,只在在主线程里加载:

请看代码

#import <UIKit/UIKit.h>
#import "MBProgressHUD.h"

@interface ViewController : UIViewController<MBProgressHUDDelegate>
{
    MBProgressHUD *_progress;
}
@property(retain,nonatomic)MBProgressHUD *progress;
@property(retain,nonatomic)IBOutlet UIImageView *image;
- (void)requestImage;@end
#import "ViewController.h"

@implementation ViewController
@synthesize progress = _progress;
@synthesize image;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    self.progress = [[MBProgressHUD alloc]initWithView:self.view];
    [self.view addSubview:self.progress];
    self.progress.delegate = self;
    self.progress.labelText = @"加载中......";
    [self.progress showWhileExecuting:@selector(requestImage) onTarget:self withObject:nil animated:YES];//一边加载一边执行里面的requestImage方法
    [super viewDidLoad];//其实这个方法也是新开一个线程,不过这个方法被封装在类里面了,大家可不必了解
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)requestImage
{
    NSData *data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://www.jiankangzu.com/pian/03/201103291210451233.jpg"]];
    image = [[UIImageView alloc]initWithImage:[UIImage imageWithData:data]];
    image.frame = CGRectMake(0, 0, 320, 480);
    [self.view addSubview:image];
}

- (void)dealloc {
    [image release];
    image = nil;
    [super dealloc];
}

@end

代码很简单不解释了,下面来看多线程的

ViewController.h文件一样,这里省略。

ViewController.m文件如下:

#import "ViewController.h"

@implementation ViewController
@synthesize progress = _progress;
@synthesize image;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    self.progress = [[MBProgressHUD alloc]initWithView:self.view];
    [self.view addSubview:self.progress];
    self.progress.delegate = self;
    self.progress.labelText = @"加载中......";
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //新开一个线程加载
    [self.progress show:YES];
    [NSThread detachNewThreadSelector:@selector(requestImage) toTarget:self withObject:nil];
}

- (void)requestImage
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    NSData *data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://www.jiankangzu.com/pian/03/201103291210451233.jpg"]];
    image = [[UIImageView alloc]initWithImage:[UIImage imageWithData:data]];
    //在另一个线程更新主界面,因为在本函数里更新主界面是无效的
    [self performSelectorOnMainThread:@selector(displayImage) withObject:nil waitUntilDone:NO];
    [pool drain];
}

//显示图片信息
-(void)displayImage
{
    //若self.progressHUD为真,则将self.progressHUD移除,设为nil
    if (self.progress){
        [self.progress removeFromSuperview];
        [self.progress release];
        self.progress = nil;
    }
    [self.view addSubview:image];
    [self.image setFrame:CGRectMake(0, 0, 320, 480)];
}

- (void)dealloc {
    [image release];
    [super dealloc];
}

两种方法的加载速度有什么差别呢?大家可以去尝试一下,如果图片多的话那一种会比较快。不过两种其实都是采用多线程加载,而第一种比较简洁,我建议大家用第一种方式。

冻死了,赶紧睡觉去,期待大家的留言......

 
 
posted @ 2012-11-27 23:51  小白猪jianjian  阅读(2219)  评论(1编辑  收藏  举报