看到标题也许会懵逼,我也为了起这个标题懵逼了半天。举个例子,现在要等到两个网络请求都结束之后才做接下来的操作。有人会说这和标题有毛线关系啊,那就往下看吧。解决这个问题的关键是知道两个网络请求什么时候结束就ok了。
方法1:设两个BOOL值在网络请求结束的时候设为YES就ok了。
//设个线程模仿网络请求
dispatch_async(dispatch_get_main_queue(), ^{
//休眠(模仿网络请求所需要的时间)
sleep(2);
self.request1 = YES;
[self requestFinish];
});
dispatch_async(dispatch_get_main_queue(), ^{
//休眠(模仿网络请求所需要的时间)
sleep(3);
self.request2 = YES;
[self requestFinish];
});
-(void)requestFinish
{
if (self.request1 && self.request2) {
//将request1和request2设为NO,可能会遇到重复加载
self.request2 = NO;
self.request1 = NO;
NSLog(@"requestFinish");
}
}
方法2:这个方法就和标题有关了,先粘为进
// 如果必须在并行队列中异步执行任务,比如说获取到两个请求后的数据再进行下一步的操作,这时可以用dispatch_group_enter和dispatch_group_leave,这两个必须成对出现,有一个enter就要有一个leave,否则会造成死锁,dispatch_group_notify不会被调用,还会崩溃的
// 全局并行队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
// 创建一个group
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group, globalQueue, ^{
// 网络请求线程
dispatch_async(globalQueue, ^{
sleep(4);
NSLog(@"group-01 - %@", [NSThread currentThread]);
dispatch_group_leave(group);
});
});
dispatch_group_enter(group);
dispatch_group_async(group, globalQueue, ^{
// 网络请求线程
dispatch_async(globalQueue, ^{
sleep(1);
NSLog(@"group-02 - %@", [NSThread currentThread]);
dispatch_group_leave(group);
});
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"完成 - %@", [NSThread currentThread]);
});
这个方法是通过并行队列和group来实现的,dispatch_group_enter
和dispatch_group_leave
保证了网络请求结束了才执行dispatch_group_notify
,现在想想方法2是不是和标题有关系了,可能还不是很符合。就这样了,谢谢大家。
网友评论