iOS多线程的简单使用

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多线程,你看我就够了, 非常详细

你可能感兴趣的:(iOS多线程的简单使用)