线程之间的通信
- 简单说明
线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信。 - 线程间通信的体现
1、一个线程传递数据给另一个线程
在一个线程中执行完特定任务后,转到另一个线程继续执行任务
线程通信示例图:
2、线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
- 代码示例1:
#import "JHViewController.h"
@interface JHViewController ()
@property(nonatomic ,strong)UIImageView * imageView;
@end
@implementation JHViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
// 屏幕上点击事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
/**
* @Description: 在子线程中调用下载图片的方法
* @param: aSelector 方法选择器,也就是你的下载方法
* @param: arg 是给方法传递的参数,如果没有参数可以写nil
* @return 空
*/
[self performSelectorInBackground:@selector(download) withObject:nil];
}
// 下载图片
- (void)download
{
//1.根据URL下载图片
//从网络中下载图片
NSURL *urlstr=[NSURL URLWithString:@"download"];
//把图片转换为二进制的数据
NSData *data=[NSData dataWithContentsOfURL:urlstr];//这一行操作会比较耗时
//把数据转换成图片
UIImage *image=[UIImage imageWithData:data];
/**
* @Description: 回到主线程中设置图片
* @param: aSelector 方法选择器,也就是你设置图片的方法
* @param: arg 是给方法传递的参数,如果没有参数可以写nil
* @param: wait 一个布尔值,它指定是否在主线程的接收端执行当前的线程块是否在指定的选择器之后。指定是要阻止此线程;否则,将立即定没有此方法返回。如果当前线程也是主线程,并且您为这个参数指定了“是”,则消息将立即发送和处理。
* @return 空
*/
[self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];
}
// 设置图片
- (void)settingImage:(UIImage *)image
{
self.imageView.image = image;
}
@end
- 代码示例2:
#import "JHViewController.h"
@interface JHViewController ()
@property(nonatomic ,strong)UIImageView * imageView;
@end
@implementation JHViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
// 屏幕上点击事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
/**
* @Description: 在子线程中调用下载图片的方法
* @param: aSelector 方法选择器,也就是你的下载方法
* @param: arg 是给方法传递的参数,如果没有参数可以写nil
* @return 空
*/
[self performSelectorInBackground:@selector(download) withObject:nil];
}
- (void)download
{
//1.根据URL下载图片
//从网络中下载图片
NSURL *urlstr=[NSURL URLWithString:@"fdsf"];
//把图片转换为二进制的数据
NSData *data=[NSData dataWithContentsOfURL:urlstr];//这一行操作会比较耗时
//把数据转换成图片
UIImage *image=[UIImage imageWithData:data];
//第一种方式
/**
* @Description: 回到主线程中设置图片
* @param: aSelector 方法选择器,也就是你设置图片的方法
* @param: arg 是给方法传递的参数,这里是image,如果没有参数可以写nil
* @param: wait 一个布尔值,它指定是否在主线程的接收端执行当前的线程块是否在指定的选择器之后。指定是要阻止此线程;否则,将立即定没有此方法返回。如果当前线程也是主线程,并且您为这个参数指定了“是”,则消息将立即发送和处理。
* @return 空
*/
// [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];
//第二种方式
/**
* @Description: 回到主线程中设置图片
* @param: aSelector 方法选择器,也就是你设置图片的方法
* @param: thread 指定要执行aSelector方法的线程
* @param: arg 是给方法传递的参数,这里是image,如果没有参数可以写nil
* @param: wait 一个布尔值,它指定是否在主线程的接收端执行当前的线程块是否在指定的选择器之后。指定是要阻止此线程;否则,将立即定没有此方法返回。如果当前线程也是主线程,并且您为这个参数指定了“是”,则消息将立即发送和处理。
* @return 空
*/
// 这里直接让imageView调用自己的setImage方法
// [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];
//第三种方式
// 这里也直接让imageView调用自己的setImage方法
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
}
//- (void)settingImage:(UIImage *)image
//{
// self.imageView.image = image;
//}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
- 示例2要注意有三种更新imageView的方法,仔细看哦,有注释的!
网友评论