必备知识架构-线程与网络-①线程

[toc]

二、谈谈你对线程间的通信的了解

< 返回目录

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

线程间通信的体现:

1
2
1. 一个线程传递数据给另一个线程
2. 在一个线程中执行完特定任务后,转到另一个线程继续执行任务

线程间通信应用举例:(即在一个线程中执行完特定任务后,转到另一个线程继续执行任务,并将该线程数据传递给另一个线程的应用举例)

以下例子摘自:线程间通讯

NSThread可以先将自己的当前线程对象注册到某个全局的对象中去,这样相互之间就可以获取对方的线程对象,然后就可以使用下面的方法进行线程间的通信了。

1
2
3
4
5
6
7
8
9
10
11
>回到主线程执行,执行self的showImage方法,参数是arg
>
>- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
>
>回到后台线程执行aSelector方法,参数是arg
>- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg
>
>回到xx线程执行aSelector方法,参数是arg
>
>- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
>

②、GCD一个线程传递数据给另一个线程。

1
2
3
4
5
6
7
8
9
10
11
12
13
> dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
> NSLog(@"donwload---%@", [NSThread currentThread]);
> // 1.子线程下载图片
> NSURL *url = [NSURL URLWithString:@"http://d.jpg"];
> NSData *data = [NSData dataWithContentsOfURL:url];
> UIImage *image = [UIImage imageWithData:data];
> // 2.回到主线程设置图片
> dispatch_async(dispatch_get_main_queue(), ^{
> NSLog(@"setting---%@ %@", [NSThread currentThread], image);
> [self.button setImage:image forState:UIControlStateNormal];
> });
> });
>

③、NSOperation线程通信的举例:在其他线程完成了耗时操作时,需要回到主线程,那么就用到了线程之间的通讯。这里有两种方法,一种是线程里转线程,另一种是线程间使用依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> // 1.创建一个新的队列
> NSOperationQueue *queue = [[NSOperationQueue alloc] init];
> // 2.添加任务(操作)
> [queue addOperationWithBlock:^{
> // 2.1在子线程中下载图片
> NSURL *url = [NSURL URLWithString:@"http://imgcache.mysodao.com/img2/M04/8C/74/CgAPDk9dyjvS1AanAAJPpRypnFA573_700x0x1.JPG"];
> NSData *data = [NSData dataWithContentsOfURL:url];
> UIImage *image = [UIImage imageWithData:data];
> // 2.2回到主线程更新UI
> [[NSOperationQueue mainQueue] addOperationWithBlock:^{
> self.imageView.image = image;
> }];
> }];
>

首先我们先来说说线程与线程间的关系,其引入了我们下面的第二点线程等待(线程同步)问题、线程依赖问题。

然后我们再来说说,有时候我们还常经常在多个线程中操作一个全局变量,这个的话,也算线程间通信吗?不管他算不算(应该是不算的,个人觉得),但是他的存在使得我们引入了另一个线程安全的问题,即多个线程操作同一个变量。也就是下面说的第三点,线程安全问题。

附:其他传值方法总结

参考:其他传值方法总结

1
2
1、A界面到B界面的正向传值,即A界面传值给B界面使用
2、。。。

END

< 返回目录