作为一名iOS开发者,我很少使用到这个锁,于是乎,都快往忘记了它的存在。NSCondition可以协调线程之间的执行,当线程之间存在数据相互依赖的情况下,它能起到很好的协调作用。下面用代码演示如何解决典型的“生产者--消费者”问题。
#import "ViewController.h"
@interface ViewController ()
{
NSCondition *_condition;
NSMutableArray *_list;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_condition = [[NSCondition alloc] init];
_list = [NSMutableArray array];
[[[NSThread alloc] initWithTarget:self selector:@selector(starProduct) object:nil] start];
[[[NSThread alloc] initWithTarget:self selector:@selector(starconsume) object:nil] start];
[_condition broadcast]; // 通知所有在等在等待中的线程
}
- (void)starconsume
{
[self consume];
}
- (void)product
{
while (_list.count > 0) {
[_condition lock];
[_condition wait];
}
NSLog(@"开始生产");
NSObject *obj = NSObject.new;
[_list addObject:obj];
NSLog(@"生产完成:%p",obj);
[_condition signal];//通知等待中的线程(只对一个线程起作用)
[_condition unlock];
}
- (void)consume
{
while (_list.count == 0) {
[_condition lock];
[_condition wait];
}
NSObject *obj = _list.firstObject;
NSLog(@"开始消费:%p",obj);
[_list removeObjectAtIndex:0];
NSLog(@"消费完成");
[_condition signal];
[_condition unlock];
}
@end