需求:开发过程中某个界面多个请求, 可有序,或者无序请求后更新UI
情景一:多个网络请求执行(无序)完后,在执行其他操作
#define GlobalQueue dispatch_get_global_queue(0, 0)
#define MainQueue dispatch_get_main_queue()
1.队列组group + notify
思路:group
其实就是管理指定queue
中任务的。在这里通过调用dispatch_group_notify
方法,等待group
中管理queue
的任务执行完毕后,会在该group
指定的队列中执行block
内部的代码。
- (void)multipleRequest_NoOrder_after_executeOtherTask_byGroupNotify {
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, GlobalQueue, ^{
sleep(1);
NSLog(@"网络请求1");
});
dispatch_group_async(group, GlobalQueue, ^{
sleep(1);
NSLog(@"网络请求2");
});
dispatch_group_async(group, GlobalQueue, ^{
sleep(1);
NSLog(@"网络请求3");
});
dispatch_group_async(group, GlobalQueue, ^{
sleep(1);
NSLog(@"网络请求4");
});
//当group中的任务执行完后,会调用
dispatch_group_notify(group, MainQueue, ^{
NSLog(@"更新UI");
});
}
无序请求
2.队列组group
- (void)text_gcd{
weakSelf(self);
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 主线程 顺序执行。dispatch_sync
// 异步线程 顺序打乱 dispatch_async
dispatch_group_enter(group);
dispatch_sync(queue, ^{
SWLog(@"开始请求1111111");
[weakSelf get_TaskData:^{
SWLog(@"请求完成 11111111");
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_sync(queue, ^{
SWLog(@"开始请求2222222");
[weakSelf get_TaskData:^{
SWLog(@"请求完成 222222222");
dispatch_group_leave(group);
}];
});
dispatch_group_enter(group);
dispatch_sync(queue, ^{
SWLog(@"开始请求33333");
[weakSelf get_TaskData:^{
SWLog(@"请求完成 3333333");
dispatch_group_leave(group);
}];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
SWLog(@"请求上面123 后走这里,回到主线程 刷新UI");
});
}
2019-03-06 16:22:30.365326+0800 MVVM+RAC[7201:533505] < ViewController.m:(109) > 开始请求1111111
2019-03-06 16:22:30.365474+0800 MVVM+RAC[7201:533505] < ViewController.m:(121) > 开始请求2222222
2019-03-06 16:22:30.365560+0800 MVVM+RAC[7201:533505] < ViewController.m:(130) > 开始请求33333
2019-03-06 16:22:30.463713+0800 MVVM+RAC[7201:533710] [] nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004
2019-03-06 16:22:32.447209+0800 MVVM+RAC[7201:533505] < ViewController.m:(111) > 请求完成 11111111
2019-03-06 16:22:32.447537+0800 MVVM+RAC[7201:533505] < ViewController.m:(123) > 请求完成 222222222
2019-03-06 16:22:32.447944+0800 MVVM+RAC[7201:533505] < ViewController.m:(132) > 请求完成 3333333
2019-03-06 16:22:32.448110+0800 MVVM+RAC[7201:533505] < ViewController.m:(138) > 请求上面123 后走这里,回到主线程 刷新UI
3 .NSOperation + NSOperationQueue
思路:通过NSBlockOperation
创建多个任务,将任务添加到NSBlockOperationQueue
中.通过调用addBarrierBlock
方法,会等到将任务添加到NSBlockOperationQueue
中所有的任务执行完毕后,才会执行block中的代码。
- (void)multipleRequest_NoOrder_after_executeOtherTask_byOperation {
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
sleep(1);
NSLog(@"网络请求1");
}];
NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
sleep(1);
NSLog(@"网络请求2");
}];
NSBlockOperation *block3 = [NSBlockOperation blockOperationWithBlock:^{
sleep(1);
NSLog(@"网络请求3");
}];
NSBlockOperation *block4 = [NSBlockOperation blockOperationWithBlock:^{
sleep(1);
NSLog(@"网络请求4");
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//设置最大并发数
queue.maxConcurrentOperationCount = [NSProcessInfo processInfo].activeProcessorCount;
//waitUntilFinished:是否等待queue中的任务执行完后,才执行后面的代码。会阻塞当前线程
[queue addOperations:@[block1,block2,block3,block4] waitUntilFinished:NO];
//当queue中的所有任务执行完后,会调用
[queue addBarrierBlock:^{
NSLog(@"更新UI");
}];
}
二、RAC(ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性)
pod 'ReactiveObjC', '~> 3.0.0' //建议纯oc代码使用ReactiveObjC
//信号量请求 类似gcd
- (void)liftSelector{
RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
SWLog(@"请求111");
[subscriber sendNext:@"11111成功"];
return nil;
}];
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
SWLog(@"请求2222");
[subscriber sendNext:@"222222成功"];
return nil;
}];
[self rac_liftSelector:@selector(refeshUI::) withSignals:signal1,signal2, nil];
}
-(void)refeshUI:(id)one :(id)two{
NSLog(@"%@---%@",one,two);
}
Log 输出
2019-03-07 14:14:29.163017+0800 MVVM+RAC[9845:694036] < ViewController.m:(115) > 请求111
2019-03-07 14:14:32.189107+0800 MVVM+RAC[9845:694036] < ViewController.m:(121) > 请求2222
2019-03-07 14:14:34.192020+0800 MVVM+RAC[9845:694036] 11111成功---222222成功