1.NSThread NSOperation,GCD发展的历程是从早到晚的,NSThread是比较轻量级的,NSOperation是对GCD的封装,GCD比较简单易用,也是苹果比较提倡和推荐的一种方式
2.NSThread控制线程的状态比较复杂,NSThead的创建主要有两种方式:
- (instancetype)init NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);
当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
前两种方法创建后,需要手机启动,启动的方法是:
- (void)start;
3.NSOperation有一个“线程池”(NSOperationQueue)的概念,他可以设置最大线程数和线程彼此间的依赖的关系,比较容易控制优先级。
使用NSOperation⼦类的方式有3种:
(1)NSInvocationOperation
(2)NSBlockOperation
(3)自定义子类继承NSOperation,实现内部相应的⽅法
注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
4.GCD有一个类似NSOperationQueue的队列dispatch_queue_t,GCD中的队列分为串行和并行队列
串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行
dispatch_queue_t queue_s = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
并行队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。
dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);
GCD还有一个队列组dispatch_group_t
dispatch_group_t group = dispatch_group_create();
举例:
通过一个并发的队列创建一个队列组
dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 10; i++) {
// if (i == 9) {
NSLog(@"11111111");
// }
}
});
dispatch_group_leave(group); //所有的11111111都打印完成后,执行其他异步队列组线程队列
dispatch_group_async(group, queue, ^{
NSLog(@"22222222");
});
dispatch_group_async(group, queue, ^{
NSLog(@"33333333");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});