iOS操作多线程的四种方法
- Pthreads(C语言框架,基本不用***主要是不会😑)
- NSThread(Apple封装的,可以直接操控线程对象,但需要自己管理线程生命周期,用的少)
- GCD(
Grand Central Dispatch
必须要会啊) - NSOperation & NSOperationQueue(苹果公司对 GCD 的封装,完全面向对象)
Pthreads
这个不常用,小弟我也不会,对此感兴趣的朋友可以研究研究,然后发布一篇详解给大家。
NSThread
不常用,估计用的最多的就[NSThread currentThread]
用来查看当前线程。所以不做详解了。
- (void)NSThread
{
// 手动启动
NSThread *theard = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[theard start];
//创建并自动启动
[NSThread detachNewThreadSelector:@selector(hahaha:) toTarget:self withObject:nil];
//获取当前线程
NSLog(@"%@", [NSThread currentThread]);
//获取主线程信息
NSLog(@"%@", [NSThread mainThread]);
//获取线程名字
[NSThread name];
}
GCD
Apple用来更好的利用多核处理器的运算。最主要的两个内容 任务
和 队列
- 任务:用来执行的事情,分为 同步执行 和 异步执行,他们之间的区别是
是否会创建新的线程
- 队列:用于存放任务, 串行队列 和 并行队列。
看代码就能明白了
/**
* 创建队列
* @param "abc" 队列标记
* @param 0 DISPATCH_QUEUE_CONCURRENT 并行 DISPATCH_QUEUE_SERIAL 串行
*/
dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_CONCURRENT);
//异步执行,创建队列
dispatch_async(queue, ^{
NSLog(@"---%@",[NSThread currentThread]);
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//处理耗时操作
//处理完毕,返回主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI界面
});
});
//获取主线程队列 dispatch_get_main_queue()
//dispatch_queue_t queue = dispatch_get_main_queue();
//获取全局子线程队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)),queue, ^{
NSLog(@"---%@",[NSThread currentThread]);
});
//用于单例模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
dispatch_group_t group = dispatch_group_create();
//2. 创建队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//执行任务,
dispatch_group_async(group, queue, ^{
for (NSInteger i = 0; i < 3; i++) {
NSLog(@"group- - %@", [NSThread currentThread]);
}
});
// 完成后通知到主线程
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"完成 - %@", [NSThread currentThread]);});
NSOperation & NSOperationQueue
NSOperation | NSOperationQueue
---------------|---------------------- ----------------------- -|
任务|队列
将要执行的任务封装 | 将此任务添加
//NSInvocationOperation封装
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
[operation start];
//NSBlockOperation封装
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]);
}];
//添加多个Block
for (NSInteger i = 0; i < 3; i++) {
[operation addExecutionBlock:^{
NSLog(@"第%ld次:%@", i, [NSThread currentThread]);
}];
}
//2.开始任务
[operation start];
//NSOperationQueue
// 主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
// 1.创建一个其他队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 队列添加任务
[queue addOperation:operation];
补充基本常识
不是官方解释,只是便于理解
这些只是一些简单的入门,如需要详细了解,推荐参考 [伯恩的遗产]写的关于iOS多线程,你看我就够了, 非常详细