您的位置:首页 > 其它

2.多线程-GCD

2016-02-24 22:04 441 查看
1.基本概念

同步任务:在当前线程按顺序执行,不开启新的线程
异步任务:有开新线程的欲望

串行队列:一个一个执行
并行队列:多个任务同时执行
---------------------------------------------------------
串行队列-同步任务 在当前线程执行
串行队列-异步任务 开一个子线程执行

/**
应用场景
比如我去同时开三个线程下载视频,只有当三个视频完全下载完毕之后,我才能做后续的事,
这个就需要用到调度组,这个调度组,就能监听它里面的任务是否都执行完毕
*/
- (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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: