iOS 多个网络请求并行/并发处理

来源:互联网 发布:c语言超市管理系统 编辑:程序博客网 时间:2024/06/04 21:16

需求:

同时存在A,B,C,D四个网络请求,要求同时发起四个网络请求,当四个网络请求都返回数据以后再处理事件E。

解决方法:

            /创建信号量/            dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);            /创建全局并行/            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);            dispatch_group_t group = dispatch_group_create();            dispatch_group_async(group, queue, ^{                NSLog(@"处理事件A");                for (int i = 0; i<10000; i++) {                    NSLog(@"打印i %d",i);                }                dispatch_semaphore_signal(semaphore);            });            dispatch_group_async(group, queue, ^{                NSLog(@"处理事件B");                for (int i = 0; i<10000; i++) {                    NSLog(@"打印j %d",i);                }                dispatch_semaphore_signal(semaphore);            });            dispatch_group_async(group, queue, ^{                NSLog(@"处理事件C");                for (int i = 0; i<10000; i++) {                    NSLog(@"打印k %d",i);                }                dispatch_semaphore_signal(semaphore);            });            dispatch_group_async(group, queue, ^{                NSLog(@"处理事件D");                for (int i = 0; i<10000; i++) {                    NSLog(@"打印l %d",i);                }                dispatch_semaphore_signal(semaphore);            });            dispatch_group_notify(group, queue, ^{                     /四个请求对应四次信号等待/                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);                    NSLog(@"处理事件E");            });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

分析: 
首先创建并行队列,创建队列组,将队列和需要处理的网络请求分别添加到组中,当组中所有队列处理完事件后调用dispatch_group_notify,我们需要在里边处理事件E。由于队列在处理网络请求时将”发送完一个请求”作为事件完成的标记(此时还未获得网络请求返回数据),所以在这里需要用信号量进行控制,在执行dispatch_group_notify前发起信号等待(4次信号等待,分别对应每个队列的信号通知),在每个队列获取到网络请求返回数据时发出信号通知。这样就能完成需求中的要求。

如果需求中改为:同时存在A,B,C,D四个任务,要求ABCD依次进行处理,当上一个完成时再进行下一个任务,当四个任务都完成时再处理事件E。这时只需要将队列改为串行队列即可(不在需要信号量控制)。

1 0