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

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

关键词:多线程 NSThread 定时器

效果图:
[img]
[img]http://dl.iteye.com/upload/attachment/0078/7349/a5f4b3aa-5eae-3af6-99f8-3be2929dc549.png[/img]
[/img],[img]
[img]http://dl.iteye.com/upload/attachment/0078/7351/ec917d48-41b5-3e30-8716-ac9e6541b6fc.png[/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值