1.相同:条件变量、条件变量测试值(触动CPU控制各个线程的等待及唤醒)、互斥锁
2.不同:NSCondition条件量本身无自带聚焦锁(需要域外变量持有条件值判断条件枷锁)
3.网络请求:实现数据任务的通信转移过程
-(void)btnClicked:(UIButton *)psender{
NSURL *url = [NSURL URLWithString:@"https://blog.csdn.net/qq_33226881"];//统一资源定位
NSURLRequest *request = [NSURLRequest requestWithURL:url];//托管请求(层次)实例
NSURLSession *session = [NSURLSession sharedSession];//会话通道(双向/单向)
NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:0];//构建ConditionLock条件锁对象实例托管,锁条件为0
dispatch_queue_t queue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);//开辟队列
for (int i=0; i<10; i++) {
//请求过程底层本质(定位数据任务会话通道中实现通信转移)(衍生URLSessionDataTask任务实例)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {//data规则数据;response响应数据;error异常报错
//completionHandler请求已完成回调块
dispatch_async(queue, ^{//
[lock lockWhenCondition:i];//当锁条件满足i时 加聚焦锁(CPU只执行当前线程(lockWhenCondition和unlockWithCondition之间指令),其他线程进入等待状态)
NSLog(@"---%d",i);
[lock unlockWithCondition:i+1];//解锁,并重置锁的条件为i+1(解除聚焦锁(CPU开始重新触动其他等待中的线程并锁的条件重置为i+1))
});
}];
[task resume];//任务开始(触动异步线程)
}
}
let a:Int = 2
let cond = NSCondition()
cond.lock()
debug("等待条件-----1111")
while a == 2{
cond.wait()
}
cond.unlock()
debug("条件得到!--------1111")
-------------------------------------------------------------------
let lock = NSConditionLock(condition: 2)
debug("等待条件-------2222")
lock.lock(whenCondition: 2)
debug("等待条件---------2222")
lock.unlock()
debug("条件得到-------2222")
NSConditionLock 继承类NSObject 遵从的协议NSLocking(lock /unlock) NSObject
//获取和释放锁
1、– (BOOL)lockBeforeDate:(NSDate *)limit
//在指定时间前尝试获取锁,若成功则返回YES 否则返回NO
2、– (void)lockWhenCondition:(NSInteger)condition
//尝试获取锁。在加锁成功前接收对象的Condition必须与参数Condition 相同
3、– (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit
//同上,只是又加上了一个时间
4、– (BOOL)tryLock //尝试着获取锁
5、– (BOOL)tryLockWhenCondition:(NSInteger)condition
//如果接收对象的condition与给定的condition相等,则尝试获取锁
6、– (void)unlockWithCondition:(NSInteger)condition
//解锁并设置接收对象的condition
NSCondition类 断言
//使线程等待
1、- (void)wait //阻塞当前线程,直到收到信号
2、- (BOOL)waitUntilDate:(NSDate *)limit
//阻塞当前线程,直到收到信号或到达指定时间
///发信号给阻塞的线程
1、- (void)signal //唤醒一个阻塞的线程
2、- (void)broadcast //唤醒所有阻塞的线程