1、多线程应用场景:主要将一些比较耗时的操作放到子线程中来做,防止在主线程中出现错做的卡顿状态;
2、常用的方法:实现多线程的方法有很多,如pthread/NSThread/GCD/NSOperation,比较常用的主要有GCD和NSOperation;
以下分解介绍GCD和NSOperation(放入下一篇)的使用方法:
GCD:
概念:
1.同步任务:需要顺序执行的任务; 只能在当前线程中执行,不能开启新线程
异步任务:可以同时执行的任务; 在新线程中执行,会开启新线程;
2.并发队列:可以让多个任务同时执行;
串行队列: 一个任务执行完再执行下一个任务;
不同队列和任务类型对应的执行方式如下表:
代码示例:
开启任务的形式:
异步任务:dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
同步任务:dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
开启队列的多种形式:
串行队列:dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)
并行队列:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT)
主队列:dispatch_get_main_queue(void),只能在主线程中执行
全局队列(并行队列):dispatch_get_global_queue(long identifier, unsigned long flags);
1、同步任务+串行队列
-(void)syncSerial
{
// 串行队列
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_CURRENT_QUEUE_LABEL, DISPATCH_QUEUE_SERIAL);
// 同步任务
dispatch_sync(queue, ^{
NSLog(@"任务1:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3:%@",[NSThread currentThread]);
});
}
2、同步任务+并发队列
-(void)syncConcurrent
{
// 并行队列
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
// 同步任务
dispatch_sync(queue, ^{
NSLog(@"任务1:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3:%@",[NSThread currentThread]);
});
}
3、异步任务+串行队列
-(void)asyncSerial
{
// 串行队列
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
// 异步任务
dispatch_async(queue, ^{
NSLog(@"任务1:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务3:%@",[NSThread currentThread]);
});
}
4、异步任务+并行队列
-(void)asyncConcurrent
{
// 串行队列
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
// 异步任务
dispatch_async(queue, ^{
NSLog(@"任务1:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务3:%@",[NSThread currentThread]);
});
}