iOS中的多线程技术
1 pthread
2 NSThread
3 GCD
4 NSOperation
在iOS中主要使用后面两种技术。
一 pthread
POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程
二 NSThread
NSThread是OC对象,所以操作相对于pthread来说简单许多,但是还是需要开发者手动管理线程。
常见用法
1 开线程三种方式
(1)
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument
(2)
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
(3)
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg
第一种方式可以配置线程,但是需要手动开启
后两种方式自动开启线程,但是无法配置。
2.判断当前线程
[NSThread currentThread]; [NSThread mainThread]; [ThreadXXX isMainThread];
3. 线程间通信
在实际过程中,我们会遇到一些耗时的操作(比如下载图片),在此情况下,为了不影响用户体验,我们需要新开子线程用于下载图片。当图片下载完成的时候,我们需要回到主线程(iOS中与UI相关的操作放到主线程中执行)中刷新图片。
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];
也可以指定特定的线程
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0)
二 GCD
用法比线程简单且高效,不需要手动管理线程。
dispatch queues 三种
1 serial queues 串行队列
同一时刻只能执行一个任务(按照任务添加顺序执行)。多个串行队列可以并发执行,互不影响。
2 ConCurrent queues 并行队列
同一时刻可以执行多个任务(按照任务添加顺序执行)。系统提供了四种并发队列。也可以自己创建。
3 main dispatch queues 主队列
串行队列,在主线程中执行。
相对于NSThread的优势
1 简单
2 多个线程对同一资源的操作,NSThread需要加锁,而在GCD中可以将两个任务放到串行队列中执行。
串行队列内存管理。
常见用法
同步与异步的区别:是否阻塞当前线程.
1 dispatch_async()函数,异步
//获取全局并发队列(系统提供的) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //添加任务,异步方式 dispatch_async(queue, ^{ //会开新线程 NSLog(@"%@",[NSThread currentThread]); }); //再添加任务 dispatch_async(queue, ^{ //会开新线程 NSLog(@"%@",[NSThread currentThread]); });
2 dispatch_sync()函数,同步方式,不开启线程.
serail queues ConCurrent queues main queues
dispatch_aysnc 开启一条新线程 开启一条或者多条新线程 不开
dispatch_sysnc 不开 不开 不开
3线程间通信(还是以下载图片为例)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ //..下载图片 //回到主线程中(相对于当前线程是异步,但是不开新的线程) dispatch_async(dispatch_get_main_queue(), ^{ //..更新图片 }); }); }
GCD其他的技术
dispatch_group,用于线程执行顺序
dispatch_semaphors,用于线程同步(多个线程按照一定顺序执行,比如对资源的访问)
dispatch Sources
dispatch_after