iOS主要知识总结(网络与多线程——GCD)

u=1546308334,1185521960&fm=21&gp=0.jpg

GCD

简介

  • 1.旨在代替NSThread等线程技术
  • 2.能够充分利用多核的特点
  • 3.用到的两个核心概念:队列(并发+串行)+任务(同步+异步)
  • 有一点需要注意:异步函数具有开启线程的能力,而同步函数不会开启线程

基本使用

  • 01 异步函数+并发队列:开启多条线程,并发执行任务(最常用)
  • 02 异步函数+串行队列:开启一条线程,串行执行任务
  • 03 同步函数+并发队列:不开线程,在当前线程里串行执行任务
  • 04 同步函数+串行队列:不开线程,在当前线程里串行执行任务
  • 05 异步函数+主队列:不开线程,在主线程中串行执行任务
  • 06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)

常用代码示例:

  • 1.异步+并发
//异步+并发(创建多个线程,并发执行)
-(void)asyncConcurrent{
    /*
     第一个参数:C语言的字符串  给队列起一个名字
     第二个参数:类型
     DISPATCH_QUEUE_CONCURRENT  并发队列
     DISPATCH_QUEUE_SERIAL      串行队列
     */
    //创建并发队列
    dispatch_queue_t queue=dispatch_queue_create("wujian.com.con", DISPATCH_QUEUE_CONCURRENT);
    //封装任务并把任务添加到队列当中
    dispatch_async(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });
}
  • 2.异步+串行
-(void)asyncSerial{
    NSLog(@"开始---");
    dispatch_queue_t queue=dispatch_queue_create("lslslslsll.com", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });
    NSLog(@"结束---");
}

注意:此处运行会发现先打印“开始--”,然后打印“结束--”,在这之后再处理这两者中间的具体任务,这其实是异步函数的一个特点,异步函数采用的是回调的机制,像打印这种简单的操作,就直接执行了,而对于异步函数里的任务,在其他操作完成之后再去执行,这样做会防止死锁的发生。

  • 3.同步+串行(在当前线程中串行执行)
-(void)syncSerial{
    dispatch_queue_t queue=dispatch_queue_create("com.sssss", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });

}
  • 4.同步+并发(不会创建线程,在当前线程中串行执行)
-(void)syncConcurrent{
    //自己创建的并发队列
//    dispatch_queue_t queue=dispatch_queue_create("ldsjfl.com", DISPATCH_QUEUE_CONCURRENT);
    //获取全局队列(用法与上面几乎无异)
    dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
    dispatch_sync(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });
}
  • 5.异步+主队列(与主线程相关):在主线程中串行执行,由于异步的执行特点,所以不会造成死锁
-(void)asyncMainQueue{
    dispatch_queue_t queue=dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });

}
  • 6.同步+主队列:会造成死锁(在子线程中不会有死锁发生)
  • 如果主队列中有任务,那么主队列会安排主线程来执行当前队列中的任务,但是在调度之前会先检查主线程的状态,如果主线程在忙那么就暂停调度队列中的任务,等到主线程空闲的时候再调度(而此处的主线程刚好在执行自身这个函数) (只有主队列关心主线程忙不忙)
-(void)syncMainQueue{
    NSLog(@"ssss");
    dispatch_queue_t queue=dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"1--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--------------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--------------%@",[NSThread currentThread]);
    });

}

获得串行队列的两种途径

  • 1.通过函数自己创建
dispatch_queue_t queue=dispatch_queue_create("lslslslsll.com", DISPATCH_QUEUE_SERIAL);
  • 2.获得系统的主队列
dispatch_queue_t queue=dispatch_get_main_queue();

获得全局队列的两种途径

  • 1.通过函数自己创建
    dispatch_queue_t queue=dispatch_queue_create("wujian.com.con", DISPATCH_QUEUE_CONCURRENT);
  • 2.获得系统的全局队列(建议使用这种方法)
//第一个参数是队列的优先级,可以传0表示默认,第二个参数暂时用不上,是苹果预留的参数,传0即可。
    dispatch_queue_t queue=dispatch_get_global_queue(0, 0);

GCD中的线程通信

- (void)viewDidLoad {
    [super viewDidLoad];

    //开子线程
    //01 获得全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //02 使用异步函数+并发队列
    dispatch_async(queue, ^{

        //03 确定URL
        NSURL *url = [NSURL URLWithString:@"http://XXXXX.jpg"];

        //04 把图片的二进制数据下载到本地
        NSData *data = [NSData dataWithContentsOfURL:url];

        //05 转换格式
        UIImage *image = [UIImage imageWithData:data];
        NSLog(@"耗时操作---%@",[NSThread currentThread]);

        //06 显示图片(回到主线程,其实是一种嵌套的模式)
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
              NSLog(@"UI操作---%@",[NSThread currentThread]);
        });
    });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容