.线程之间的通信

//有一个特别耗时的操作,比如说网络请求,开启子线程去请求网络,我们一般是要在主线程更新UI,如何从子线程跳转到主线程?

#import "ViewController.h"

 @interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (IBAction)downLoadImage:(id)sender {

    [self performSelectorInBackground:@selector(loadImage) withObject:nil];

}

- (void)loadImage {

    NSLog(@"loadImage - %@",[NSThread currentThread]);

    NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

    UIImage * image = [UIImage imageWithData:data];

    //waitUntilDone

//    [self performSelectorOnMainThread:@selector(changeMainThread:) withObject:image waitUntilDone:NO];

//    [self performSelector:@selector(changeMainThread:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];

    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];

     // waitUntilDone:是什么意思?

    // YES:等待loadImage:这个方法执行完毕之后,再执行当前线程后续的操作

    // NO:不等待loadImage:这个方法执行完毕,就执行当前线程后续的操作

    NSLog(@"waitUntilDone");

//    self.imageView.image = image;

}

.GCD基础

核心概念

 任务:block里需要执行的操作

 队列:把任务添加进入队列中,按照先进先出的原则来执行任务

 串行队列:一个一个的执行

 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。

 同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行

 异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻  执行任务

 同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务

 同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务

 异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行

 异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

 主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI)

 异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务

 同步任务主队列:死锁

 全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级

 开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程)

 开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的

 */

- (void)gcdTest6 {

    dispatch_queue_t queue = dispatch_get_main_queue();

    NSLog(@"");

    //在主队列里执行同步操作,产生死锁

    //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。

    dispatch_sync(queue, ^{

        NSLog(@"");

    });

    NSLog(@"");

}

- (void)gcdTest5 {

    // 主队列就是一种特殊的串行队列

    // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行

    dispatch_queue_t queue = dispatch_get_main_queue();

    NSLog(@"开始");

    for (NSInteger i = ; i < ; i ++) {

        //主队列执行异步操作,异步操作有一个等待的过程

        dispatch_async(queue, ^{

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

        });

    }

    NSLog(@"结束");

}

//并发队列:多个线程同时执行

//同步操作:不会开启新的线程

//执行结果:不会开启新的线程,立即执行

- (void)gcdTest4 {

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

    NSLog(@"开始");

    for (NSInteger i =  ; i < ; i ++ ) {

        dispatch_sync(queue, ^{

            NSLog(@"%@,%@",[NSThread currentThread],@(i));

        });

    }

    NSLog(@"结束");

}

//并发队列:多个线程同时执行

//异步操作:会开启新的线程

//执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

- (void)gcdTest3 {

    //开启并发队列

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

    NSLog(@"开始");

    for (NSInteger i =  ; i < ; i ++ ) {

        //执行异步操作

        dispatch_async(queue, ^{

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

        });

    }

    NSLog(@"结束");

}

//串行队列:一个一个执行

//异步操作:会开启新的线程

//执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

- (void)gcdTest2 {

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);

    NSLog(@"开始");

    for (NSInteger i =  ; i < ; i ++ ) {

        //异步请求

        dispatch_async(queue, ^{

            NSLog(@"%@,%@",[NSThread currentThread],@(i));

        });

    }

    NSLog(@"结束");

}

//串行队列:一个一个执行

//同步操作:不开启新的线程

//执行结果:不开启新的线程,一个一个顺序执行

- (void)gcdTest1 {

    //label:队列名

    //attr:队列属性(串行,并发)

    //DISPATCH_QUEUE_SERIAL 串行

    //DISPATCH_QUEUE_CONCURRENT 并发

    //#define DISPATCH_QUEUE_SERIAL NULL

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);

    NSLog(@"开始");

    //同步操作

    //操作任务:block

    dispatch_sync(queue, ^{

        //打印当前线程

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

    });

    NSLog(@"结束");

}

.GCD线程之间通信

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (IBAction)downLoadImage:(id)sender {

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

    //获取全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(, );

    //执行异步操作

    dispatch_async(queue, ^{

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

        NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";

        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

        UIImage * image = [UIImage imageWithData:data];

        //返回主线程更新UI

        dispatch_async(dispatch_get_main_queue(), ^{

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

            self.imageView.image = image;

        });

    });

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //同步操作用途

    dispatch_queue_t queue = dispatch_get_global_queue(, );

    dispatch_sync(queue, ^{

        NSLog(@"登录");

    });

    dispatch_async(queue, ^{

        NSLog(@"下载斗破苍穹");

    });

    dispatch_async(queue, ^{

        NSLog(@"下载大主宰");

    });

}

iOS多线程邂逅的更多相关文章

  1. iOS多线程主题

    下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  3. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  4. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. iOS多线程学习及总结

    能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一.      iOS有三种多线程编程的技术,分别是: 1.        NSThread 2.        Cocoa NSOp ...

  8. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

随机推荐

  1. mark:如何使用FileZilla连接虚拟机上的Fedora

    1. 下载FileZilla 2. 在虚拟机上安装SSH,http://linuxconfig.org/how-to-install-start-and-connect-to-ssh-server-o ...

  2. linux rdate

    检查服务器时间,发现服务器时间与当前时间错了很多.于是调整. 使用ntpdate ,不管如何设置,包括关闭防火期,设置ntp.conf,结果都不成功. 随即使用网上提供的另外一种方法,临时先解决一下燃 ...

  3. ASP.NET MVC3 在_ViewStart設定Layout後用RenderAction的注意事項

    ASP.NET MVC3 在_ViewStart設定Layout後用RenderAction的注意事項 3/24 TW MVC第一次活動圓滿的結束了,雖然是RC,但也來了不少願意聽我們分享的好朋友. ...

  4. 受限玻尔兹曼机(RBM)学习笔记(五)梯度计算公式

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...

  5. iOS-金额小写转大写

    一.目的 1. 金额小写转化成大写. 如 123456.65 --> 壹拾贰万叁仟肆佰伍拾陆元陆角伍分 2. 只能处理13位数的金额,并且只能处理到小数点后两位. 二.代码 #import &q ...

  6. C++中指针和引用的区别

    ①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.

  7. 【Android】记录反编译安卓程序步骤

    主要是为了分析一个 App 里面用到的接口,以后移植 UWP 用. 1.http://jd.benow.ca/ 下载 JD-GUI. 2.https://github.com/pxb1988/dex2 ...

  8. AutoMapper配置方法

    在Mvc开发中,我们经常需要构建一个viewModel出来供页面使用,在PO和VO之间相互传值的时候,如果实体字段比较多的时候,那么传值将变得异常麻烦,也使得代码非常的臃肿.AutoMapper可以帮 ...

  9. OnMeasureItem和OnDrawItem的区别和联系

    我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题.拥有美丽的外观,软件就成功了一半.界面由控件.工具栏.菜单.窗体等元素组成,对他们进行美化就能得到一个美丽的界面. 目前 ...

  10. ThinkPHP系的两个东东OneThink和ThinkCMF

    假设有这样一个命题:需要对一个已有系统进行移植,有没有什么系统是适合用来作为进行快速移植的基础的.能解决每个系统的基本问题,只需考虑相关业务逻辑问题. OneThink是TP团队官方出品. http: ...