多线程
主要处理延时任务或者任务太大 影响主线程 的时候用多线程
单线程 必须要做完一件事以后 再去做另外一件事
多线程 可以同时进行多件事 但是完成事件的时间不一定按照先后顺序实现。
使用GCD实现多线程 会简化多线程的应用开发。
队列:队列负责管理开发者提交的任务,GCD队列始终先进先出的方式来处理任务,任务的执行时间不相同,处理任务不一定先结束。
串行队列:每次只处理一个任务,必须给前一个任务完成后,才执行下一个任务,
并行队列:可以处理多个任务,将会有任务并发执行。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// GCD 延时操作
[self yyyyssss];
[self yyyysssscccc];
// 后台执行:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// something
});
// 主线程执行:
dispatch_async(dispatch_get_main_queue(), ^{
// something
});
// 一次性执行:
static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{
// code to be executed once
});
// 延迟2秒执行:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
// 高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
}
-(void)yyyyssss{
UIProgressView *progress = [[UIProgressView alloc] initWithFrame:CGRectMake(10, 50, 200, 10)];
[self.view addSubview:progress];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i <100; i++) {
//注意:不要在子子线程中更新UI
dispatch_async(dispatch_get_main_queue(), ^{
progress.progress +=0.1;
});
// 线程休眠
[NSThread sleepForTimeInterval:0.1];
}
});
NSLog(@"下载完成");
}
-(void)yyyysssscccc{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (ino64_t)(5 *NSEC_PER_SEC)), dispatch_get_main_queue(),^{
NSLog(@"我是一只消息爱心哦翱翔啊");
});
// 代码只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"这句话我只说一次");
});
}