iOS多线程基础

104 阅读2分钟

多线程

  • Runloop:每个线程都有一个runloop去查询是否有用户操作
  • 主线程:app一直存在的线程;所有UI操作放在主线程,保证流畅体验和线程安全
  • 非主线程:如网络操作:获取图片等,IO操作等放非主线程;一些耗时较长的操作
  • NSThread:频繁创建线程,使用不方便,功能局限;每一次都要创建线程,用完后自动销毁,会占用较多CPU资源(例如表中有图片,)
  • GCD:Grand Cenetral Dispatch, 代码中以Dispatch开头的,解决NSThread中如获取图片和设置UIImageView的image在同一个非主线程的问题(前者应在非主线程,后者应在主线程)
    • 队列 :
      • 串行队列:队列中的任务需要一个一个完成,且在一个线程中
      • 并行队列:队列中的任务可以同时完成(可以在多个线程中同时执行任务)
    • 任务
      • 同步执行:任务需要一个一个地被执行;需等待当前的任务执行完才可以执行下一个任务【不具备开启新线程的能力】
      • 异步执行:把任务加进队列里,不需等待,就去下一个任务【开启新线程】
    • GCD使用:创建一个队列,将需同步或异步执行的任务添加进队列
    • 队列+任务
      • 串行队列:同步执行:不开启新线程,同步执行任务;异步执行:开启一个线程,在这个线程中串行执行任务
      • 并行队列:同步执行:开启新线程,同步执行任务;异步执行:开启多个线程,并行执行任务 image.png GCD队列分为主队列-主线程,非主队列(high,default,low,background),自定义队列
- (**void**) dispatch

{

        dispatch_queue_global_t imageQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 创建队列

    dispatch_queue_main_t mainQueue = dispatch_get_main_queue();

    dispatch_async(imageQueue, ^{   //在非主队列异步执行

        // 执行下载操作

        dispatch_async(mainQueue, ^{    // 在主队列,即主线程异步执行

            //执行UI操作

        });

    });
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init];
    [blockOperation addExecutionBlock:^{
        // 任务代码
    }];
    [queue addOperation:blockOperation];    // 添加Operation
}

image.png

  • NSOperation :GCD的面向对象的封装
    • NSOperationQueue:任务队列 (GCD中的队列)
    • NSOperation:执行的任务 (GCD中Block中的任务)

Runloop-<Thread(NSThread)-<Queue(GCD,NSOpertion)-<开发者将业务逻辑加到队列中去