iPhone开发【十四】多线程开发之NSThread——子线程模拟耗时操作
2013-02-01 17:16
465 查看
[b][b]转载请注明出处,原文网址:/article/1354668.html
作者:张燕广[/b][/b]
实现的功能:1)演示多线程开发。2)子线程中模拟耗时操作,然后通知主线程更新进度条。
关键词:多线程 NSThread 定时器
1、新建视图控制器ViewController.m(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI,ViewController.h如下:
[cpp] view
plaincopy
#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如下:
[cpp] view
plaincopy
#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
2、运行效果如下:
[b]
[/b]
作者:张燕广[/b][/b]
实现的功能:1)演示多线程开发。2)子线程中模拟耗时操作,然后通知主线程更新进度条。
关键词:多线程 NSThread 定时器
1、新建视图控制器ViewController.m(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI,ViewController.h如下:
[cpp] view
plaincopy
#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如下:
[cpp] view
plaincopy
#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
2、运行效果如下:
[b]
[/b]
相关文章推荐
- iPhone开发【十四】多线程开发之NSThread——子线程模拟耗时操作
- iPhone开发【十五】多线程开发之NSThread——异步下载图片
- iphone开发中的多线程:NSThread、NSOperation、GCD
- iPhone开发【十五】多线程开发之NSThread——异步下载图片
- iOS多线程开发之NSThread
- iphone开发之多线程NSThread和NSInvocationOperation
- iphone开发之多线程NSThread和NSInvocationOperation
- iphone开发之多线程NSThread和NSInvocationOperation
- iphone开发之多线程NSThread和NSInvocationOperation
- iOS开发实践之多线程(NSThread)
- iOS之多线程开发(NSThread,NSOperation,GCD)
- iphone开发之多线程NSThread和NSInvocationOperation
- iphone开发之多线程NSThread和NSInvocationOperation .
- iphone开发之多线程NSThread和NSInvocationOperation
- IOS多线程开发-NSThread原理及演示
- iphone开发之多线程NSThread和NSInvocationOperation
- iphone开发之多线程NSThread和NSInvocationOperation
- iOS开发 - 多线程之NSThread
- iphone开发之多线程NSThread和NSInvocationOperation
- iOS多线程编程之NSThread的使用 分类: ios开发 2015-01-01 12:36 123人阅读 评论(0) 收藏