iOS开发小功能之十一:线程间的通信(3种方式)

三种方法都是通过touchesBegin监听屏幕的触摸实现

一、performSelector方式

 1 #import "ViewController.h"
 2 @interface ViewController ()
 3 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
 4 @end
 5 @implementation ViewController
 6 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 7 {
 8     //放入子线程
 9     [self performSelectorInBackground:@selector(download3) withObject:nil];
10 }
11
12 //下载放入子线程,显示图片应该放在主线程!!!否则会导致刷新问题
13 - (void)download3
14 {
15     //图片的网络路径
16     NSURL *url = [NSURL URLWithString:@"http://ww2.sinaimg.cn/mw690/63e6fd01jw1f3f3rf75goj20qo0zkagy.jpg"];
17     //下载图片数据
18     NSData *data = [NSData dataWithContentsOfURL:url];
19
20     //生成图片
21     UIImage *image = [UIImage imageWithData:data];
22     //回到主线程显示图片方法一:
23 //    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
24     //回到主线程显示图片方法二:
25     //waitUntilDone:表示是否等待主线程做完事情后往下走,YES表示做完后执行下面事,NO表示跟下面事一起执行
26     [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
27     //回到主线程显示图片方法三:
28     [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
29 }
30 //主线程显示图片
31 - (void)showImage:(UIImage *)image
32 {
33     self.imageView.image = image;
34 }

二、GCD方式

 1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 2 {
 3     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 4         //图片的网络途径
 5         NSURL *url = [NSURL URLWithString:@"http://ww2.sinaimg.cn/mw1024/75614297jw1f34e5llyz4j20qo0zj0zl.jpg"];
 6         //加载图片
 7         NSData *data = [NSData dataWithContentsOfURL:url];
 8         //生成图片
 9         UIImage *image = [UIImage imageWithData:data];10         //回到主线程
11         dispatch_async(dispatch_get_main_queue(), ^{
12             self.imageView.image = image;
13         });
14     });
15
16 }

三、operation方式(此种方式更具有面向对象特性!)

 1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
 2 {
 3     //直接开始子线程执行任务
 4     [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
 5         NSURL *url = [NSURL URLWithString:@"http://ww4.sinaimg.cn/mw690/63e6fd01jw1ezxz499hy5j21gt0z94qq.jpg"];
 6         NSData *data = [NSData dataWithContentsOfURL:url];
 7         UIImage *image = [UIImage imageWithData:data];
 8         //回到主线程
 9         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
10             //显示图片
11             self.imageView.image = image;
12         }];
13     }];
14 }

以上三种方式都需要在main storyboard中拖一个imageView,然后设置自动布!!

时间: 2024-08-01 22:31:28

iOS开发小功能之十一:线程间的通信(3种方式)的相关文章

iOS开发小功能之八:手势的简单使用(6种)以及代理方法

代码: 1 #import "ViewController.h" 2 @interface ViewController () <UIGestureRecognizerDelegate> 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 5 @end 7 @implementation ViewController 8 - (void)viewDidLoad { 9 [super viewDidLo

多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

线程间的通信、同步方式与进程间通信方式

1.线程间的通信方式 1)使用全局变量(由于多个线程可能更改全局变量,因此全局变量最好声明为volatile) 2) 使用消息实现通信 3)使用事件CEvent类实现线程间的通信 2.同步/异步(C端) 同步:在C端发出一个功能调用时,没有得到结果之前就不返回 异步: 一个请求通过事件触发后,得到服务器处理后才处理完毕 3. 阻塞/非阻塞(S端) 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行).函数只有在得到

自学iOS开发小功能之六:UIApplication

一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplication sharedApplication]可以获得这个单例对象. (4) 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个. (5

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

14 线程间协作的两种方式:wait、notify、notifyAll和Condition

原文链接:http://www.cnblogs.com/dolphin0520/p/3920385.html 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者

线程间协作的两种方式

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

iOS开发小功能自学之二:分页(进行封装处理)

主要用Xib方式,代码后期还会有进一步的优化 下次用代码的时候一定要复制一份再用,直接拿出源代码来不小心哪里碰了下,耽误了10多分钟去找bug,郁闷!!! 功能:类似于手机打开新浪网首页最上面的大图片,自动滚动,右下角有个页数显示. 思路和注意点:1.主要用到的是scrollView和page control 2.在Xib中布置好控件 3.封装三部曲(首先在自定义构造方法内添加子控件,其次在layoutSubview中添加子控件的尺寸(此方法有随着外部尺寸变化,子控件尺寸比例随  着变化的动能)