NSThread&GCD&NSOperationQueue简介
2022-01-14 本文已影响0人
希尔罗斯沃德_董
iOS中使用多线程的方式
主要有三种:NSThread、GCD、NSOperation&NSOperationQueue
NSThread
通过NSThread我们可以自己手动开辟和管理子线程。如果是使用初始化的方式就需要我们自己启动,如果使用的是构造器方式它就会自动启动。只要我们手动开辟线程,都需要我们自己管理该线程,不只是启动,还有该线程使用完毕后的资源回收。
代码示例:
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(doAction1) object:nil];
self.thread.name = @"NSThread";
self.thread.threadPriority = 1;
[self.thread start];
[self performSelector:@selector(doAction2) onThread:self.thread withObject:nil waitUntilDone:YES];
- (void)doAction1
{
NSLog(@"doAction 1");
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSPort *port = [NSPort port];
[runloop addPort:port forMode:NSDefaultRunLoopMode];
[runloop run];
}
- (void)doAction2
{
NSLog(@"doAction 2");
[self.thread cancel];
}
GCD
GCD使用比较简便,我们可以通过同步异步函数和串行并行队列的组合快速实现代码逻辑。同步函数会阻塞当前线程,异步函数不会阻塞。串行队列任务是一个执行完成才能执行下一个,而并行队列则是可以同时执行多个任务。使用示例:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"GCD");
});
NSOperation&NSOperationQueue
NSOperationQueue的底层实现跟GCD是一样的,实际上可以任务NSOperation&NSOperationQueue是基于GCD的上层封装。相比于GCD是纯c语言,NSOperationQueue这是面向对象的OC语言。执行效率GCD略高,但是差别也不大。
使用示例:
NSOperationQueue *quque = [[NSOperationQueue alloc] init];
quque.name = @"NSOperationQueue";
quque.maxConcurrentOperationCount = 5;
[quque addOperationWithBlock:^{
NSLog(@"Block");
}];
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation");
}];
[quque addOperation:block];
在使用上,相比于GCD,NSOperation&NSOperationQueue主要有以下几个优势:
1、NSOperationQueue可以设置最大并发数,可以设置优先级,添加依赖关系等调整执行顺序;
2、NSOperationQueue 可以设置跨队列依赖关系,但是只能通过设置串行队列,或者在队列内提阿尼啊barrier任务,或者嵌套调用,才能控制顺序,较为复杂;
3、NSOperationQueue是面向对象的,所以支持KVO,可以监测operation是否正在执行、是否结束、是否取消等。