iOS GCD基本用法介绍

首先讲一下什么是线程,线程是系统调度的最小单位,进程是CPU分配资源的最小单位,通常情况下每个APP对应一个进程,当界面刚显示出来的时候,默认进程中的主线程已经启动。

线程跟进程在CPU中的区别

    线程的内存在进程中是共享的,进程的内存在CPU中是独立的

再讲解一下基本的概念

    同步:任务在同一个线程中执行

    异步:任务在不同的线程中执行

   主线成:UI视图,通常用作UI的更新以及显示,当出现同步任务时候,如果延时任务都在主线程中,会造成卡顿。

    子线程:为了缓解UI视图的压力,通常将延时操作放在子线程中,主线成不会造成卡顿。

    串行:任务一个一个按照顺序执行

    并行:任务同时进行

    GCD是苹果推出的多线程方案,整体API使用C语言调用。线程的生命周期由GCD控制,比如线程的创建,任务的调度,线程的销毁。

      dispatch_group_t group = dispatch_group_create();    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_group_enter(group);    dispatch_group_async(group, queue, ^{        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{            NSLog(@"1");            dispatch_group_leave(group);        });            });    dispatch_group_enter(group);    dispatch_group_async(group, queue, ^{        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{            NSLog(@"2");            dispatch_group_leave(group);        });            });            dispatch_group_notify(group, queue, ^{        NSLog(@"结束");    });

当需要处理多条网络请求可以使用线程组的方式,在任务执行前需要有dispatch_group_enter,在任务执行玩的时候,需要用dispatch_group_leave结束任务,有多少个dispatch_group_enter就需要有多少个dispatch_group_leave。

创建串行队列

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

创建并行队列

    dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_SERIAL);

创建同步任务

dispatch_sync(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)

创建异步任务

  dispatch_async(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)

信号量

    

线程间的通信

NSThread版本

[self performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];

GCD版本

 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);     dispatch_queue_t mainQueue = dispatch_get_main_queue();     dispatch_async(globalQueue, ^{         NSLog(@"子线程处理耗时任务");         dispatch_async(mainQueue, ^{             NSLog(@"子线程回到主线成");         });     });

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容