IOS多线程相关:GCD及NSOperation的使用

    xiaoxiao2025-04-06  19

    1、多线程应用场景:主要将一些比较耗时的操作放到子线程中来做,防止在主线程中出现错做的卡顿状态;

    2、常用的方法:实现多线程的方法有很多,如pthread/NSThread/GCD/NSOperation,比较常用的主要有GCD和NSOperation;  

    以下分解介绍GCD和NSOperation(放入下一篇)的使用方法:

    GCD:

    概念

    1.同步任务:需要顺序执行的任务;  只能在当前线程中执行,不能开启新线程

       异步任务:可以同时执行的任务;  在新线程中执行,会开启新线程;

    2.并发队列:可以让多个任务同时执行;

      串行队列: 一个任务执行完再执行下一个任务;

    不同队列和任务类型对应的执行方式如下表:

    代码示例:

    开启任务的形式:

    异步任务:dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    同步任务:dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

    开启队列的多种形式:

    串行队列:dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)

    并行队列:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT)

    主队列:dispatch_get_main_queue(void),只能在主线程中执行

    全局队列(并行队列):dispatch_get_global_queue(long identifier, unsigned long flags);

    1、同步任务+串行队列

    -(void)syncSerial

    {

        // 串行队列

        dispatch_queue_t queue = dispatch_queue_create(DISPATCH_CURRENT_QUEUE_LABEL, DISPATCH_QUEUE_SERIAL);

        // 同步任务

        dispatch_sync(queue, ^{

            NSLog(@"任务1%@",[NSThread currentThread]);

        });

        

        dispatch_sync(queue, ^{

            NSLog(@"任务2%@",[NSThread currentThread]);

        });

        

        dispatch_sync(queue, ^{

            NSLog(@"任务3%@",[NSThread currentThread]);

        });

        

        

    }

    2、同步任务+并发队列

    -(void)syncConcurrent

    {

        // 并行队列

        dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);

        // 同步任务

        dispatch_sync(queue, ^{

            NSLog(@"任务1%@",[NSThread currentThread]);

        });

        

        dispatch_sync(queue, ^{

            NSLog(@"任务2%@",[NSThread currentThread]);

        });

        

        dispatch_sync(queue, ^{

            NSLog(@"任务3%@",[NSThread currentThread]);

        });

    }

    3、异步任务+串行队列

    -(void)asyncSerial

    {

        // 串行队列

        dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);

        // 异步任务

        dispatch_async(queue, ^{

            NSLog(@"任务1%@",[NSThread currentThread]);

        });

        

        dispatch_async(queue, ^{

            NSLog(@"任务2%@",[NSThread currentThread]);

        });

        

        dispatch_async(queue, ^{

            NSLog(@"任务3%@",[NSThread currentThread]);

        });

    }

    4、异步任务+并行队列

    -(void)asyncConcurrent

    {

        // 串行队列

        dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);

        // 异步任务

        dispatch_async(queue, ^{

            NSLog(@"任务1%@",[NSThread currentThread]);

        });

        

        dispatch_async(queue, ^{

            NSLog(@"任务2%@",[NSThread currentThread]);

        });

        

        dispatch_async(queue, ^{

            NSLog(@"任务3%@",[NSThread currentThread]);

        });

    }

    转载请注明原文地址: https://ju.6miu.com/read-1297803.html
    最新回复(0)