ios33--线程通信
//
// ViewController.m
// 06-掌握-线程间通信
//
// atomic:为set方法加锁,线程安全,需要消耗资源。
// nonatomic:不为set方法加锁,非线程安全,适合内存小的移动设备
// #import "ViewController.h" @interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController #pragma mark ----------------------
#pragma Events -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:nil];
} #pragma mark ----------------------
#pragma Methods //开子线程下载图片,回到主线程刷新UI
-(void)download
{
//1.确定URL
NSURL *url = [NSURL URLWithString:@"/Users/mctc/Desktop/Snip20170907_1.png"];
//2.根据url下载图片二进制数据到本地
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.转换图片格式
UIImage *image = [UIImage imageWithData:imageData];
NSLog(@"download----%@",[NSThread currentThread]);
//self.imageView.image = image;//不可以显示图片,子线程不能刷新UI //4.回到主线程显示UI //waitUntilDone:是否等待,YES表示performSelectorOnMainThread方法执行完之后,代码才能向下走。
[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO]; [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES]; [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; NSLog(@"---end---");
} //计算代码段执行时间的第一种方法
-(void)download1
{
//0.000018
//0.166099 //1.确定URL
NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.700_0.jpeg"]; NSDate *start = [NSDate date]; //获得当前的时间 //2.根据url下载图片二进制数据到本地
NSData *imageData = [NSData dataWithContentsOfURL:url]; NSDate *end = [NSDate date]; //获得当前的时间
NSLog(@"%f",[end timeIntervalSinceDate:start]); //3.转换图片格式
UIImage *image = [UIImage imageWithData:imageData]; //4.显示UI
self.imageView.image = image;
} //计算代码段执行时间的第二种方法
-(void)download2
{
//1.确定URL
NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.700_0.jpeg"]; CFTimeInterval start = CFAbsoluteTimeGetCurrent(); //2.根据url下载图片二进制数据到本地
NSData *imageData = [NSData dataWithContentsOfURL:url]; CFTimeInterval end = CFAbsoluteTimeGetCurrent();
NSLog(@"end-start = %f---%f---%f",end - start,end,start); //3.转换图片格式
UIImage *image = [UIImage imageWithData:imageData]; //4.显示UI
self.imageView.image = image;
} //更新UI操作
-(void)showImage:(UIImage *)image
{
self.imageView.image = image;
NSLog(@"UI----%@",[NSThread currentThread]);
} @end
ios33--线程通信的更多相关文章
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- C# 线程通信 一
C#多线程通信 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- Java---Condition控制线程通信
java中控制线程通信的方法有:1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyAll()控制线程通信.不灵活. 2.利用Conditio ...
- Java 线程通信
线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...
- Java核心知识点学习----使用Condition控制线程通信
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...
- java笔记--关于线程通信
关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.h ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- Java线程同步和线程通信
一.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步. 不可变类总是线程安全的,因为它的对象状态是不可改变的,但可变类对象需要额外的方法来保证线程安全. 1.同步 ...
随机推荐
- python 3 廖雪峰博客笔记(三) 命令行模式与交互模式
python 的代码一般保存为 .py结尾的文本文件格式 比如 add.py 里写下如下内容 100 + 200 执行 add.py有两种方式: 1. 命令行方式:将python代码写入脚本中执行 p ...
- BZOJ4873 LuoguP3749 寿司餐厅
题面太长,请诸位自行品尝—>寿司餐厅 分析: 首先题目中给了限制条件,假如选了D(i,j)(i<j),那么也就选了D(i+1,j)和D(i,j-1)两个点. 于是我们一下就明白了,哦,最大 ...
- memcached协议解析 及使用
本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...
- php 实现301重定向跳转实例代码
本文主要介绍php 实现301重定向跳转,通过实例代码让大家更好的理解重定向的方法,有需要的小伙伴可以参考下 在php中301重定向实现方法很简单我们只要简单的利用header发送301状态代码,然后 ...
- kubernetes 知识点及常用命令
一.附上一个Deployment文件 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selec ...
- Python之模块和包的创建与使用
一.模块的概念 在计算机的开发过程中,随着程序代码越写越多,在一个文件里代码就越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,放在不同的文件里面,这样,每个文件包含的代码就相对 ...
- SpringMVC参数接收
1 绑定简单类型 要根据id查询商品数据,需要从请求的参数中把请求的id取出来.Id应该包含在Request对象中.可以从Request对象中取id. public ModelAndView item ...
- 关于No Spring WebApplicationInitializer types detected on classpath的提示,tomcat 卡主
No Spring WebApplicationInitializer types detected on classpath 下一句:Initializing Spring root WebAppl ...
- 全文搜索(A-3)-用户建模
用户模型可以分为静态模型.动态模型.混合推荐用户模型. 静态模型往往通过显式方式收集用户偏好信息: 动态模型通过隐式方式收集用户偏好信息: 基于内容的用户系统的推荐模型: 关键字匹配,空间向量模型 协 ...
- Linux下汇编语言学习笔记32 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...