線程之間的通信
- 簡單說明
線程間通信:在1個進程中,線程往往不是孤立存在的,多個線程之間需要經常進行通信。 - 線程間通信的體現
1、一個線程傳遞數據給另一個線程
在一個線程中執行完特定任務后,轉到另一個線程繼續執行任務
線程通信示例圖:
1.png
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的方法,仔細看哦,有注釋的!