`

iPhone开发多线程开发之NSThread——子线程模拟耗时操作 .

    博客分类:
  • ios
阅读更多
实现的功能:1)演示多线程开发。2)子线程中模拟耗时操作,然后通知主线程更新进度条。

关键词:多线程 NSThread 定时器

效果图:
[img]

[/img],[img]

[/img]




1、新建视图控制器ViewController.m(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI,ViewController.h如下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    CGFloat progressValue; //进度条的值
}

@property(strong,nonatomic)UIProgressView *progress; 
@property(strong,nonatomic)UILabel *showValue;
@property(strong,nonatomic)UIButton *startThread;

@end


ViewController.m如下:
#import "ViewController.h"

@implementation ViewController
@synthesize progress;
@synthesize showValue;
@synthesize startThread;

-(void)loadView{
    CGRect appFrame = [UIScreen mainScreen].applicationFrame;
    UIView *view = [[UIView alloc]initWithFrame:appFrame];
    self.view = view;
    
    //设置背景颜色
    UIColor *bgcolor = [UIColor grayColor];
    [self.view setBackgroundColor:bgcolor];
    
    [self initViews];
}

//初始化视图组件
-(void)initViews{
    //初始化progress
    CGRect frame = CGRectMake(50, 50, 200, 30);
    progress = [[UIProgressView alloc]initWithFrame:frame];
    [self.view addSubview:progress];
    
    //初始化showValue
    showValue = [[UILabel alloc]init];
    frame = showValue.frame;
    frame.origin.x = CGRectGetMaxX(progress.frame)+10;
    frame.origin.y = CGRectGetMinY(progress.frame);
    frame.size.width = 35;
    frame.size.height = 15;
    showValue.frame = frame;
    showValue.backgroundColor = [UIColor redColor];
    showValue.text = @"0.0";
    [self.view addSubview:showValue];
    
    //初始化startThread
    startThread = [[UIButton alloc]init];
    frame = startThread.frame;
    frame.origin.x = 110;
    frame.origin.y = 80;
    frame.size.width = 100;
    frame.size.height = 50;
    startThread.frame = frame;
    UIImage *img = [UIImage imageNamed:@"btn.png"];
    [startThread setBackgroundImage:img forState:UIControlStateNormal];
    [startThread setTitleColor:[UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0] forState:UIControlStateNormal];
    [startThread setTitle:@"开启子线程" forState:UIControlStateNormal];
    //设置事件
    [startThread addTarget:self action:@selector(startThreadButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:startThread];
}

//开启子线程
-(void)startThreadButtonPressed{
    progress.progress = 0.0;
    showValue.text = @"0.0";
    startThread.hidden = YES;
    //该语句会让主线程堵塞2秒,这就是为什么要将耗时操作放在子线程的原因之一
    //[NSThread sleepForTimeInterval:2];
    
    //开启一个新线程
    [NSThread detachNewThreadSelector:@selector(doJobInBackground) toTarget:self withObject:nil];
}

//子线程,后台执行工作
-(void)doJobInBackground{
    //睡眠,模拟子线程中耗时操作
    [NSThread sleepForTimeInterval:2];
    //通知主线程执行更新操作
    [self performSelectorOnMainThread:@selector(invalidateProgress) withObject:nil waitUntilDone:NO];
}

//更新进度
-(void)invalidateProgress{
    progressValue = [progress progress];
    showValue.text = [NSString stringWithFormat:@"%.2f",progressValue];
    if(progressValue < 1.0){
        progress.progress = progressValue+0.02;
        //启动定时器
        [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(invalidateProgress) userInfo:nil repeats:NO];
    }else{
        progress.progress = 1.0;
        showValue.text = @"1.0";
        startThread.hidden = NO;
    }
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    progress = nil;
    showValue = nil;
    startThread = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end



  • 大小: 78.6 KB
  • 大小: 71.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics