2.多线程-GCD
2016-02-24 22:04
441 查看
1.基本概念
同步任务:在当前线程按顺序执行,不开启新的线程
异步任务:有开新线程的欲望
串行队列:一个一个执行
并行队列:多个任务同时执行
---------------------------------------------------------
串行队列-同步任务 在当前线程执行
串行队列-异步任务 开一个子线程执行
View Code
7.定时器与运行循环
同步任务:在当前线程按顺序执行,不开启新的线程
异步任务:有开新线程的欲望
串行队列:一个一个执行
并行队列:多个任务同时执行
---------------------------------------------------------
串行队列-同步任务 在当前线程执行
串行队列-异步任务 开一个子线程执行
/** 应用场景 比如我去同时开三个线程下载视频,只有当三个视频完全下载完毕之后,我才能做后续的事, 这个就需要用到调度组,这个调度组,就能监听它里面的任务是否都执行完毕 */ - (void)execGroupDispatch{ //1.创建一个调度组 dispatch_group_t group = dispatch_group_create(); //2.获取全局队列 dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0); //3.三个下载任务 dispatch_group_enter(group); //引用计数+1 void (^task1) () = ^(){ NSLog(@"%@----下载片头",[NSThread currentThread]); dispatch_group_leave(group); //引用计数-1 }; dispatch_group_enter(group); //引用计数+1 void (^task2) () = ^(){ NSLog(@"%@----下载中间的内容",[NSThread currentThread]); [NSThread sleepForTimeInterval:5.0]; NSLog(@"--下载中间内容完毕---"); dispatch_group_leave(group);//引用计数-1 }; void (^task3) () = ^(){ NSLog(@"%@----下载片尾",[NSThread currentThread]); }; //3.需要将我们的队列和任务,加入组内去监控 dispatch_group_async(group, globalQueue, task1); dispatch_group_async(group, globalQueue, task2); dispatch_group_async(group, globalQueue, task3); //4.监听的函数 /** 参数1:组 参数2:参数3在哪个线程里面执行 参数3:组内完全下载完毕之后,需要执行的代码 */ dispatch_group_notify(group, dispatch_get_main_queue(), ^{ //表示组内的所有任务都完成之后,会来到这里 NSLog(@"把下好的视频按照顺序拼接好,然后显示在UI去播放"); }); }
View Code
7.定时器与运行循环
@interface ViewController () @property (nonatomic, assign) int count; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self performSelectorInBackground:@selector(subThreadRun) withObject:nil]; } - (void)subThreadRun{ NSLog(@"%s----%@",__func__,[NSThread currentThread]); //1.定义了一个定时器 NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeEvent) userInfo:nil repeats:YES]; //2.将我们的定时器加入到运行循环,只有加入到当前的运行循环里面去,他才知道你这个时候,有一个定时任务 /** NSDefaultRunLoopMode 当拖动的时候,它会停掉 因为这种模式是互斥的 forMode:UITrackingRunLoopMode 只有输入的时候,它才会去执行定时器任务 NSRunLoopCommonModes 包含了前面两种 */ //[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; //[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; //下载,定时源事件,输入源事件,如果放在子线程里面,如果想要它执行任务,就必须开启子线程的运行循环 CFRunLoopRun(); } - (void)timeEvent{ self.count ++; NSLog(@"%d",self.count); if (self.count==5) { NSLog(@"---guale---"); //停止当前的运行循环 CFRunLoopStop(CFRunLoopGetCurrent()); } }
相关文章推荐
- C#5.0 采用CancellationTokenSource方式取消Task
- 权限分析
- XPath语法以及谓语的结合使用
- iOS多线程
- 从现有仓库克隆并开发项目
- [hdu5225][BC#40]Tom and permutation
- Container With Most Water
- Linux中的Buffer 与 Cache
- 【Mastering Machine Learning with scikit-learn (python+spark版)】Chapter2 Linear Regression
- Memcached 笔记
- 使用Vitamio打造自己的Android万能播放器(1)——准备
- AIDL随写
- Spring整合RabbitMQ进行消息队列开发
- 备份系列——Exp/Imp基本使用指南
- 修改oracle database中user的密码遇到ORA-28003和ORA-20001
- 为Node.js编写组件的几种方式
- angular自定义组件popbox练习日志(一)
- Hdu 2027 getchar用法
- 文件访问权限详解(eclipse和studio如何访问虚拟机内部的存储内容)
- 自定义ScrollView