iOS中多线程_05_线程间通信NSThread/GCD

1、什么叫做线程间通信

  在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

2、线程间通信的体现

  1个线程传递数据给另1个线程

  在1个线程中执行完特定任务后,转到另1个线程继续执行任务

3、线程间通信示例

  UIImageView下载图片这个例子, 主线程中开启一个子线程去下载图片, 当图片下载完成之后再回到主线程中更新显示图片, 这样的一个过程就是线程间通信的一个过程.

4、NSThread线程间通信常用方法

// 第一种- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;// 第二种
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

5、使用NSThread多线程间通信

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4
 5     // 使用多线程来下载图片
 6     [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
 7 }
 8
 9 - (void)downloadImage
10 {
11     NSLog(@"开始下载图片 %@", [NSThread currentThread]);
12
13     // 下载的方法
14     // 1. url网络资源
15     NSURL *url = [NSURL URLWithString:@"http://pic12.nipic.com/20110124/4814485_135921152102_2.jpg"];
16
17     // 2. OC原生的方法,网络上的所有数据都是以“二进制或者字符串”的方式传递的
18     // 在以后的开发中,几乎不用,因为性能太差
19     NSData *data = [NSData dataWithContentsOfURL:url];
20
21     // 3. 根据下载的数据建立图像
22     UIImage *image = [UIImage imageWithData:data];
23
24     NSLog(@"完成下载图片 %@", [NSThread currentThread]);
25
26     // 更新UI,需要在主线程上进行
27     // waitUntilDone:是否等待setImage:方法结束
28     [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
29 }

  以上代码是用NSThread多线程方式实现子线程下载图片,在主线程更新UI的操作

  上边这段代码是有问题的,应该在多线程上加一个自动释放池

6、使用GCD完成多线程间通信

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4
 5     // 下载图片
 6     [self downloadImage];
 7 }
 8
 9 - (void)downloadImage
10 {
11     // 1. 全局并行队列
12     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
13
14     // 2. 异步任务
15     dispatch_async(queue, ^{
16         NSLog(@"开始下载图片 %@", [NSThread currentThread]);
17
18         // 下载的方法
19         // 1. url网络资源
20         NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1208/30/c0/13398570_1346308990114_800x600.jpg"];
21
22         // 2. OC原生的方法,网络上的所有数据都是以“二进制或者字符串”的方式传递的
23         // 在以后的开发中,几乎不用,因为性能太差
24         NSData *data = [NSData dataWithContentsOfURL:url];
25
26         // 3. 根据下载的数据建立图像
27         UIImage *image = [UIImage imageWithData:data];
28
29         NSLog(@"完成下载图片 %@", [NSThread currentThread]);
30
31         // 4. 通知主队列更新UI
32         // 给主队列,添加一个异步任务,更新UI
33         dispatch_async(dispatch_get_main_queue(), ^{
34             self.image = image;
35         });
36     });
37 }

  与NSThread方式相比,不用考虑自动释放池的问题,而且异步任务的操作都是放在块代码中,比较集中,可读性好。

时间: 2024-10-14 02:14:06

iOS中多线程_05_线程间通信NSThread/GCD的相关文章

iOS开发多线程篇—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

iOS开发多线程篇—线程间的通信(转)

这里转载 给自己一个备份 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aS

iOS开发多线程篇---线程间的通信

线程间通信的表现: 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 下面是一个下载图片的例子: @interface BTThreadViewController () {     UIImageView *imagev; } @end - (void)viewDidLoad {     [super viewDidLoad];          imagev = [[UIImageView alloc] initWithFrame:CGRectMake(

Java多线程 二 线程间通信

线程间通信: 多个线程在处理同一资源,但是 等待唤醒机制 涉及的方法: 1.wait() 让线程处于冻结状态,被wait的线程会被存储到线程池中. 2.notify() 唤醒线程池中的一个线程(任意) 3.notifyAll() 唤醒线程池中的所有线程.. 这些方法都必须定义在同步中, 因为这些方法是用于操作线程状态的方法. 必须明确到底操作的那个锁上的线程. 为什么操作线程的方法wait notify notifyAll定义在了Object中. 因为这些方法是监视器方法,监视器其实就是锁. 锁

IOS第二天多线程-03线程间通信

**** #import "HMViewController.h" @interface HMViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loadi

android 中的 Handler 线程间通信

一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // handle the nsg message... } }; private void sendMessage() { handler.sendEmptyMessage(11); } 打开handler的源码可以在它的构造函数中

iOS多线程技术—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

OS开发多线程篇—线程间的通信

iosblog's iOS开发多线程篇—线程间的通信 Cocoa为iOS线程间通信提供2种方式,1种是performSelector,另1种是Port. 先说第1种,performSelector,有以下几种: 第2种为NSMachPort方式.NSPort有3个子类,NSSocketPort.NSMessagePort.NSMachPort,但在iOS下只有NSMachPort可用. 使用的方式为接收线程中注册NSMachPort,在另外的线程中使用此port发送消息,则被注册线程会收到相应消

进程间通信与线程间通信

序 今天被问及进程间通信的问题,发现自己了解的并不够,所以,对此好好总结一番~ 操作系统的主要任务是管理计算机的软件.硬件资源.现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此.所以操作系统就借助于进程来管理计算机的软.硬件资源,支持多任务的并行执行.要并行执行就需要多进程.多线程.因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信.而线程间通信又和进程间的通信不同.由于进程的数据空间相对独立而线程是共享数据空间的,彼此通信机制也很不同