4.3 NSThread->5.0 线程间通讯和常用方法

本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


本文相关目录:
==================== 所属文集:4.0 多线程 ====================
4.1 多线程基础->1.0 进程 & 线程
······················ 2.0 多线程简介
4.2 pthread
4.3 NSThread->1.0 创建线程
····················· 2.0 线程属性
····················· 3.0 线程状态/线程生命周期
····················· 4.0 多线程安全隐患
····················· 5.0 线程间通讯和常用方法
4.4 GCD->1.0 GCD简介和使用
·············· 2.0 线程间的通信
·············· 3.0 其他用法
·············· 4.0 GCD 的定时器事件
4.5 NSOperation->1.0 NSOperation简介
························ 2.0 NSOperationQueue
························ 3.0 线程间通信
························ 4.0 自定义NSOperation
4.6 RunLoop - 运行循环
===================== 所属文集:4.0 多线程 =====================


5.1 线程间通讯和常用方法

线程间通信:
概念 : 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
线程间通信的体现 :
- 1个线程传递数据给另1个线程

- 在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信常用方法 :
//在主线程执行操作 (从子线程回到主线程)(推荐)
- (void)performSelectorOnMainThread:(SEL)aSelector
                         withObject:(id)arg
                      waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector
               onThread:(NSThread *)thr
             withObject:(id)arg
          waitUntilDone:(BOOL)wait;
另外一种线程之间的通信方式:NSPort(端口)
包括的子类:
(1)NSMessagePort;
(2)NSMachPort;

5.2 线程间通信示例 – 图片下载:

4.3 NSThread->5.0 线程间通讯和常用方法_第1张图片
线程间通信示例 – 图片下载.png
#import "ViewController.h"

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

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  // 开启子线程(在子线程中调用download方法下载图片)
  [self performSelectorInBackground:@selector(download) withObject:nil];
}

#pragma mark - 图片下载
- (void)download {
  // 1.图片的网络路径
  NSURL *url =
      [NSURL URLWithString:@"http://www.5068.com/u/faceimg/20140804114111.jpg"];

  // 2.下载图片并把图片转换为二进制的数据(耗时操作)
  NSData *data = [NSData dataWithContentsOfURL:url];

  // 3.生成图片(把数据转换成图片)
  UIImage *image = [UIImage imageWithData:data];

  // 4.回到主线程中设置图片
  // 方法1:
  [self.imageView
      performSelector:@selector(setImage:)
             onThread:[NSThread mainThread]
           withObject:image
        waitUntilDone:NO]; //是否等到@selector的方法完成后再往下执行,NO表示否

  //方法2:
  [self.imageView performSelectorOnMainThread:@selector(setImage:)
                                   withObject:image
                                waitUntilDone:NO];
  // 方法3:代码一
  [self performSelectorOnMainThread:@selector(showImage:)
                         withObject:image
                      waitUntilDone:NO];
}

// 方法3:代码二
- (void)showImage:(UIImage *)image {
  self.imageView.image = image; //设置显示图片
}

#pragma mark - 测试图片下载时间 方法1:NSDate
- (void)download1 {
  // 1.图片的网络路径
  NSURL *url =
      [NSURL URLWithString:@"http://www.5068.com/u/faceimg/20140804114111.jpg"];

  NSDate *begin = [NSDate date]; //开始时间

  // 2.根据图片的网络路径去下载图片数据
  NSData *data = [NSData dataWithContentsOfURL:url];

  NSDate *end = [NSDate date]; //结束时间

  NSLog(@"%f", [end timeIntervalSinceDate:begin]); // 时间间隔 = 开始-结束

  // 3.显示图片
  self.imageView.image = [UIImage imageWithData:data];
}

#pragma mark - 测试图片下载时间 方法2:CFTimeInterval
- (void)download2 {
  // 1.图片的网络路径
  NSURL *url =
      [NSURL URLWithString:@"http://www.5068.com/u/faceimg/20140804114111.jpg"];

  CFTimeInterval begin = CFAbsoluteTimeGetCurrent(); // 开始时间

  // 2.根据图片的网络路径去下载图片数据
  NSData *data = [NSData dataWithContentsOfURL:url];

  CFTimeInterval end = CFAbsoluteTimeGetCurrent(); //结束时间

  NSLog(@"%f", end - begin); // 时间间隔 = 开始-结束

  // 3.显示图片
  self.imageView.image = [UIImage imageWithData:data];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end

本文源码 Demo 详见 Github
https://github.com/shorfng/iOS_4.0_multithreading.git





作者:蓝田(Loto)
出处:

如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
如有疑问,请通过以下方式交流:
评论区回复微信(加好友请注明“+称呼”)发送邮件[email protected]



本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

你可能感兴趣的:(4.3 NSThread->5.0 线程间通讯和常用方法)