IOS Xib 简单多线程编程代码
2013-10-10 10:55
232 查看
1、新建一个Single View Application工程,起名“MutableThread”.
2、在ViewController.xib 中拖入一个UILable,UIButton,UIActivityIndicatorView,然后和ViewController这个类进行关联。
3、源代码如下说明问题。
ViewController.h文件
#import<UIKit/UIKit.h>
@interface ViewController :UIViewController
@property (weak,nonatomic)IBOutletUILabel
*myLabel;
@property (weak,nonatomic)IBOutletUIButton
*myBtn;
@property (weak,nonatomic)IBOutletUIActivityIndicatorView
*myActIndicView;
- (IBAction)btnClicked:(id)sender;
@end
ViewController.m文件
#import "ViewController.h"
@interface
ViewController ()
- (void)firstWork;
- (void)secondWork;
- (void)thirdWork;
- (void)finallyWork;
@end
@implementation ViewController{
int x;
int a;
int b;
}
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_myActIndicView.hidesWhenStopped =YES;
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)btnClicked:(id)sender {
//记录开始时间
NSDate * startTime = [NSDatedate];
[_myActIndicViewstartAnimating];
_myBtn.alpha =0.5;
_myBtn.enabled =false;
//开始多线程 DISPATCH_QUEUE_PRIORITY_DEFAULT默认的方法是由系统决定什么时候有空才执行线程,自己不用考虑死锁的问题,GCD(Great
Center Dispatch,伟大的中央调度系统)已经解决了
//创建一个全局的多线程队列,把所有线程放到这个队列中,由系统去调度执行。在这个队列中,再取调度主线程。主线程要用 dispatch_get_main_queue()
//多线程的代码并不是在当前这个方法中执行的,他们是两个不同的方法。是先执行当前方法,然后再去执行多线程的方法。
dispatch_queue_t rootQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//把有睡眠语句的方法放到队列里面执行,异步执行
dispatch_async(rootQueue, ^{
[self firstWork];
dispatch_group_t subGroup =
dispatch_group_create();
//因为
secondWork thirdWork 这两个方法谁先执行,谁后执行对结果没有影响,为了提高运行效率,可以选择将这两个方法异步执行,这样的话,只需要5s,如果同步执行的话,需要7s。所以用两个dispatch_group_async,代表两个方法同时执行
dispatch_group_async(subGroup, rootQueue, ^{
[self
secondWork];
});
dispatch_group_async(subGroup, rootQueue, ^{
[self
thirdWork];
});
//其他线程执行完后,要去通知主线程更新UI界面
dispatch_group_notify(subGroup, rootQueue, ^{
[self
finallyWork];
//更新主UI的方法,必须用主线程 dispatch_get_main_queue()才可以。千万不要写成rootQueue
dispatch_async(dispatch_get_main_queue(), ^{
[_myActIndicView
stopAnimating];
_myBtn.alpha =1;
_myBtn.enabled =YES;
_myLabel.text =
[NSStringstringWithFormat:@"the result is %d",b];
//记录结束时间
NSDate * endTime = [NSDatedate];
//既然如此,NSDate * startTime这是一个局部变量,出了当前 btnClicked这个方法后,局部变量应该就已经释放了,为什么在这句中还能用呢?原因是,dispatch方法强引用了startTime,startTime的retainCount
+ 1,指针指向了startTime这个局部变量的内存空间。dispatch方法和btnClicked方法是两个不同的指针指向startTime这个局部变量的内存空间
NSLog(@"use %f seconds",[endTimetimeIntervalSinceDate:startTime]);
});
});
});
}
- (void)firstWork
{
sleep(3);
x ++;
a = 5;
b = 0;
}
- (void)secondWork
{
sleep(5);
b = b +x;
}
- (void)thirdWork
{
sleep(2);
b = b +a;
}
- (void)finallyWork
{
NSLog(@"b is %d",b);
}
@end
2、在ViewController.xib 中拖入一个UILable,UIButton,UIActivityIndicatorView,然后和ViewController这个类进行关联。
3、源代码如下说明问题。
ViewController.h文件
#import<UIKit/UIKit.h>
@interface ViewController :UIViewController
@property (weak,nonatomic)IBOutletUILabel
*myLabel;
@property (weak,nonatomic)IBOutletUIButton
*myBtn;
@property (weak,nonatomic)IBOutletUIActivityIndicatorView
*myActIndicView;
- (IBAction)btnClicked:(id)sender;
@end
ViewController.m文件
#import "ViewController.h"
@interface
ViewController ()
- (void)firstWork;
- (void)secondWork;
- (void)thirdWork;
- (void)finallyWork;
@end
@implementation ViewController{
int x;
int a;
int b;
}
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_myActIndicView.hidesWhenStopped =YES;
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)btnClicked:(id)sender {
//记录开始时间
NSDate * startTime = [NSDatedate];
[_myActIndicViewstartAnimating];
_myBtn.alpha =0.5;
_myBtn.enabled =false;
//开始多线程 DISPATCH_QUEUE_PRIORITY_DEFAULT默认的方法是由系统决定什么时候有空才执行线程,自己不用考虑死锁的问题,GCD(Great
Center Dispatch,伟大的中央调度系统)已经解决了
//创建一个全局的多线程队列,把所有线程放到这个队列中,由系统去调度执行。在这个队列中,再取调度主线程。主线程要用 dispatch_get_main_queue()
//多线程的代码并不是在当前这个方法中执行的,他们是两个不同的方法。是先执行当前方法,然后再去执行多线程的方法。
dispatch_queue_t rootQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//把有睡眠语句的方法放到队列里面执行,异步执行
dispatch_async(rootQueue, ^{
[self firstWork];
dispatch_group_t subGroup =
dispatch_group_create();
//因为
secondWork thirdWork 这两个方法谁先执行,谁后执行对结果没有影响,为了提高运行效率,可以选择将这两个方法异步执行,这样的话,只需要5s,如果同步执行的话,需要7s。所以用两个dispatch_group_async,代表两个方法同时执行
dispatch_group_async(subGroup, rootQueue, ^{
[self
secondWork];
});
dispatch_group_async(subGroup, rootQueue, ^{
[self
thirdWork];
});
//其他线程执行完后,要去通知主线程更新UI界面
dispatch_group_notify(subGroup, rootQueue, ^{
[self
finallyWork];
//更新主UI的方法,必须用主线程 dispatch_get_main_queue()才可以。千万不要写成rootQueue
dispatch_async(dispatch_get_main_queue(), ^{
[_myActIndicView
stopAnimating];
_myBtn.alpha =1;
_myBtn.enabled =YES;
_myLabel.text =
[NSStringstringWithFormat:@"the result is %d",b];
//记录结束时间
NSDate * endTime = [NSDatedate];
//既然如此,NSDate * startTime这是一个局部变量,出了当前 btnClicked这个方法后,局部变量应该就已经释放了,为什么在这句中还能用呢?原因是,dispatch方法强引用了startTime,startTime的retainCount
+ 1,指针指向了startTime这个局部变量的内存空间。dispatch方法和btnClicked方法是两个不同的指针指向startTime这个局部变量的内存空间
NSLog(@"use %f seconds",[endTimetimeIntervalSinceDate:startTime]);
});
});
});
}
- (void)firstWork
{
sleep(3);
x ++;
a = 5;
b = 0;
}
- (void)secondWork
{
sleep(5);
b = b +x;
}
- (void)thirdWork
{
sleep(2);
b = b +a;
}
- (void)finallyWork
{
NSLog(@"b is %d",b);
}
@end
相关文章推荐
- iOS多线程编程及简单封装图片下载
- Java编程之多线程死锁与线程间通信简单实现代码
- 大钟的ios开发之旅(4)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- iOS开发之优秀开源框架IQKeyboardManager,零行代码解决键盘遮挡问题,如此简单解决键盘遮挡问题,IQKeyboardManager源码分解
- Linux socket编程(三) 简单的多线程聊天室
- 【iOS开发-113】在storyboard上用AutoLayout,纯代码实现AutoLayout布局方法以及简单动画
- .Net开发中的多线程编程进行一个简单的总结
- C++ 代码点评. 简单再简单,遵循C和C++ 编程的原则规范,减少代码Bug
- iOS多线程编程之NSThread的使用
- iOS 使用纯代码自定义UITableViewCell实现一个简单的微博界面布局
- iOS有三种多线程编程的技术
- 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
- iOS多线程编程:线程同步总结
- iOS开发多线程篇—多线程简单介绍
- IOS多线程_GCD的简单使用和详细说明
- ios git简单上传代码文件
- iOS 开发中的争议(二)UI到底应该用xib/storyboard完成,还是用手写代码来完成?
- iOS边练边学--UIScrollView和xib文件实现简单分页+定时器初使用
- AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)