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

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

Cocoa为iOS线程间通信提供2种方式,1种是performSelector,另1种是Port。

  先说第1种,performSelector,有以下几种:

  

  第2种为NSMachPort方式。NSPort有3个子类,NSSocketPort、NSMessagePort、NSMachPort,但在iOS下只有NSMachPort可用。

     使用的方式为接收线程中注册NSMachPort,在另外的线程中使用此port发送消息,则被注册线程会收到相应消息,然后最终在主线程里调用某个回调函数。

     可以看到,使用NSMachPort的结果为调用了其它线程的1个函数,而这正是performSelector所做的事情,所以,NSMachPort是个鸡肋。线程间通信应该都通过performSelector来搞定。

 

线程间通信的表现:

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

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

下面是一个下载图片的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@interface BTThreadViewController ()
{
    UIImageView *imagev;
}
@end
 
- (void)viewDidLoad
{
    [super viewDidLoad];
     
    imagev = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.view addSubview:imagev];
     
    //子线程里面调用downImage方法下载图片
    [self performSelectorInBackground:@selector(downImage) withObject:nil];
}
 
-(void)downImage
{
    //从网络中下载图片
    NSURL *url = [NSURL URLWithString:@"http://i8.topit.me/8/c1/31/1142319854bdc31c18o.jpg"];
    //将图片转换为二进制数据
    NSData *imgData = [NSData dataWithContentsOfURL:url];
    //数据转换成图片
    UIImage *img = [UIImage imageWithData:imgData];
     
    //回到主线程设置图片
    [self performSelectorOnMainThread:@selector(senderImage:) withObject:img waitUntilDone:NO];
}
 
-(void)senderImage:(UIImage *)image
{
    imagev.image = image;
}

 

 

 
原文地址:https://www.cnblogs.com/HypeCheng/p/4500597.html