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; }
|
昵称:
注销 订阅评论
[使用Ctrl+Enter键快速提交]
融云,免费为你的App加入IM功能——让你的App“聊”起来!!
· 聘用老程序员的4大原因
· 和阿里云成立合资企业的迪拜企业Meraas是什么来头?
· 国际空间站的迷你电脑长啥样?能运行多系统长得还挺漂亮
· Ubuntu进军物联网
· 联通举办5·17网购节 存1元送240元话费
» 更多新闻...
· 贫血,充血模型的解释以及一些经验
· 如何避免软件工程中最昂贵错误的发生
· 面向服务体系和遗留系统
· 运维的本质——可视化