当前位置: 代码迷 >> Iphone >> iPhone开发多线程开发之NSThread——子线程模拟耗时操作
  详细解决方案

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

热度:59   发布时间:2016-04-25 06:05:16.0
iPhone开发多线程开发之NSThread——子线程模拟耗时操作 .
实现的功能: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



  相关解决方案