#线程间通信(补一个DEMO)
维基百科:指至少两个线程间传送数据或信号的一些方法
##线程间通信的体现
- 一个线程传递数据给另一个线程
- 在一个线程中执行完特定任务后,转到另一个线程继续执行任务
###NSThread
- 在指定线程上执行操作
`[self performSelector:@selector(operate) onThread:thread withObject:nil waitUntilDone:YES]`
- 在主线程上执行操作
`[self performSelectorOnMainThread:@selector(operate) withObject:nil waitUntilDone:YES]`
例:子线程下载图片,然后回主线程刷新UI
##线程共享内存空间
- 优点:线程安全,自动加锁
- 缺点:消耗大量资源(为保证线程安全,会不停加锁)
```
static MyClass _instance
+(id)shareInstance {
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
if(_instance == nil) _instance = [[MyClass alloc] init];
});
return _instance;
}
```
##添加线程依赖关系
- NSOperation:可以利用`NSOperationqueue` 控制单个线程之间关系。
`addDependency:` 添加依赖关系
`removeDependency:` 删除依赖关系
```
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){
NSLog(@"执行NO.1操作,线程:%@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
NSLog(@"执行NO.2操作,线程:%@", [NSThread currentThread]);
}];
// operation1依赖于operation2 (先执行operation2)
[operation1 addDependency:operation2];
[queue addOperation:operation1];
[queue addOperation:operation2];
```
- GCD: 利用Group监控调度一组线程。
```
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
dispatch_group_t group = dispatch_group_create();
__block UIImage *img1 = nil;
__block UIImage *img2 = nil;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
img1 = [self loadImg:imgUrl1];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
img2 = [self loadImg:imgUrl2];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
self.imgview1.image = img1;
self.imgView2.image = img2;
});
});
```
##信号量(semaphore)
###如何控制线程并发量
- NSOperation: 我们可以利用`NSOperationqueue`来控制单个线程间关系, `setMaxConcurrentOperationCount` 这个函数来控制最大并发量。
```
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//每次执行‘number’个操作
[queue setMaxConcurrentOperationCount:number];
```
- GCD: 在GCD中我们可以利用dispatch_semaphore来处理控制并发。
####信号量:是一个整形值并且具有一个初始计数值。有两个操作分别为:通知和等待。
semaphore- dispatch_semaphore_create: 创建一个整形数值的信号,即:信号的总量
- dispatch_semaphore_signal: 发送一个信号,让信号总量增加1
- dispatch_semaphore_wait: 首先判断信号量是否大于零,如果大于零则减掉1个信号量,往下执行,如果等于零则阻塞该线程
网友评论