1.dispatch_group_enter(),dispatch_group_leave() 的应用
简单来说,它们分别代表进入group和离开group.想想以下代码打印的顺序是多少?
dispatch_group_t group = dispatch_group_create();
NSLog(@"1");
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2");
dispatch_group_leave(group);
});
NSLog(@"3");
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"4");
dispatch_group_leave(group);
});
NSLog(@"5");
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"6");
});
正确的打印结果如下图: (1,3,2,5,4,6)
2.dispatch_semaphore的应用
设计一个并发数量为n(n>0,为整数)的DEMO
int n = 5;//假设并发数量为5
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t sem = dispatch_semaphore_create(n);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for(int i=0 ;i <100;i++){
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_group_async(group, queue, ^{
NSLog(@"%i",i);
sleep(2);
dispatch_semaphore_signal(sem);
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
为了验证结果,抛出证据来:
3.死锁案例
//用SDWebImage来判断本地是否存在高清图片,运行此代码发现界面控件无法响应事件。
- (BOOL)hasHighQImage{
__block BOOL hasHighQImage = NO;
SDWebImageManager *manager = [SDWebImageManager sharedManager];
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[manager diskImageExistsForURL:[self highQualityImageURLForIndex:self.currentImageIndex] completion:^(BOOL isInCache) {
hasHighQImage = isInCache;
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return hasHighQImage;
}