dispatch_group_async(group, dispatch_queue_create(
"com.dispatch.test"
,
DISPATCH_QUEUE_CONCURRENT
), ^{
// 设置一个网络请求
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:
@"
https://www.github.com
"
]];
// 创建一个信号量为0的信号(红灯)
dispatch_semaphore_t sema = dispatch_semaphore_create(
0
);
NSURLSessionDownloadTask *task = [[NSURLSession sharedSession] downloadTaskWithRequest:request completionHandler:^(NSURL *
_Nullable
location, NSURLResponse *
_Nullable
response, NSError *
_Nullable
error) {
NSLog(
@"第一步操作"
);
// 使信号的信号量+1,这里的信号量本来为0,+1信号量为1(绿灯)
dispatch_semaphore_signal(sema);
}];
[task resume];
// 以下还要进行一些其他的耗时操作
NSLog(
@"耗时操作继续进行"
);
// 开启信号等待,设置等待时间为永久,直到信号的信号量大于等于1(绿灯)
dispatch_semaphore_wait(sema,
DISPATCH_TIME_FOREVER
);
});
dispatch_barrier
我们可以利用dispatch_barrier的特性实现读写安全的模型。
通过dispatch_barrier_async函数提交的任务会等它前面的任务执行完才开始
,然后它后面的任务必须等它执行完毕才能开始
。
必须使用dispatch_queue_create创建的队列才会达到上面的效果。
- (
id
)cacheWithKey:(
id
)key
{
__block
id
obj;
// 任意线程都可以'读’
dispatch_sync
(queue, ^{
obj = [
self
.cache
objectForKey:key];
});
return
obj;
}
- (
id
)cacheWithKey:(
id
)key
{
__block
id
obj;
// 任意线程都可以'读’
dispatch_sync
(queue, ^{
obj = [
self
.cache
objectForKey:key];
});
return
obj;
}