多线程
- Runloop:每个线程都有一个runloop去查询是否有用户操作
- 主线程:app一直存在的线程;所有UI操作放在主线程,保证流畅体验和线程安全
- 非主线程:如网络操作:获取图片等,IO操作等放非主线程;一些耗时较长的操作
- NSThread:频繁创建线程,使用不方便,功能局限;每一次都要创建线程,用完后自动销毁,会占用较多CPU资源(例如表中有图片,)
- GCD:Grand Cenetral Dispatch, 代码中以Dispatch开头的,解决NSThread中如获取图片和设置UIImageView的image在同一个非主线程的问题(前者应在非主线程,后者应在主线程)
- 队列 :
- 串行队列:队列中的任务需要一个一个完成,且在一个线程中
- 并行队列:队列中的任务可以同时完成(可以在多个线程中同时执行任务)
- 任务
- 同步执行:任务需要一个一个地被执行;需等待当前的任务执行完才可以执行下一个任务【不具备开启新线程的能力】
- 异步执行:把任务加进队列里,不需等待,就去下一个任务【开启新线程】
- GCD使用:创建一个队列,将需同步或异步执行的任务添加进队列
- 队列+任务
- 串行队列:同步执行:不开启新线程,同步执行任务;异步执行:开启一个线程,在这个线程中串行执行任务
- 并行队列:同步执行:开启新线程,同步执行任务;异步执行:开启多个线程,并行执行任务
GCD队列分为主队列-主线程,非主队列(high,default,low,background),自定义队列
- 队列 :
- (**void**) dispatch
{
dispatch_queue_global_t imageQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 创建队列
dispatch_queue_main_t mainQueue = dispatch_get_main_queue();
dispatch_async(imageQueue, ^{ //在非主队列异步执行
// 执行下载操作
dispatch_async(mainQueue, ^{ // 在主队列,即主线程异步执行
//执行UI操作
});
});
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init];
[blockOperation addExecutionBlock:^{
// 任务代码
}];
[queue addOperation:blockOperation]; // 添加Operation
}
- NSOperation :GCD的面向对象的封装
- NSOperationQueue:任务队列 (GCD中的队列)
- NSOperation:执行的任务 (GCD中Block中的任务)