zoukankan      html  css  js  c++  java
  • 手动管理GCD调度组

    本文通过模拟当前流行的网络框架AFNetworking的使用,来演示手动管理GCD调度组的过程。

    代码:

    AFHTTPRequestOperationManager.h:

    #import <Foundation/Foundation.h>
    
    @interface AFHTTPRequestOperationManager : NSObject
    
    + (instancetype)manager;
    
    - (void)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)())success failure:(void (^)())failure;
    
    @end

    AFHTTPRequestOperationManager.m:

    #import "AFHTTPRequestOperationManager.h"
    
    @implementation AFHTTPRequestOperationManager
    
    + (instancetype)manager {
        return [[self alloc] init];
    }
    
    - (void)GET:(NSString *)URLString parameters:(id)parameters success:(void(^)())success failure:(void(^)())failure {
        NSUInteger duration = arc4random_uniform(5) + 1;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            success();
        });
    }
    
    @end

    ViewController.m:

    #import "ViewController.h"
    #import "AFHTTPRequestOperationManager.h"
    
    @interface ViewController ()
    
    @property (strong, nonatomic) dispatch_group_t group;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        
        dispatch_group_enter(self.group);
        [manager GET:nil parameters:nil success:^{
            NSLog(@"A done.");
            dispatch_group_leave(self.group);
        } failure:nil];
        
        dispatch_group_enter(self.group);
        [manager GET:nil parameters:nil success:^{
            NSLog(@"B done.");
            dispatch_group_leave(self.group);
        } failure:nil];
        
        dispatch_group_enter(self.group);
        [manager GET:nil parameters:nil success:^{
            NSLog(@"C done.");
            dispatch_group_leave(self.group);
        } failure:nil];
        
        dispatch_group_enter(self.group);
        [manager GET:nil parameters:nil success:^{
            NSLog(@"D done.");
            dispatch_group_leave(self.group);
        } failure:nil];
        
        dispatch_group_enter(self.group);
        [manager GET:nil parameters:nil success:^{
            NSLog(@"E done.");
            dispatch_group_leave(self.group);
        } failure:nil];
        
        dispatch_group_notify(self.group, dispatch_get_main_queue(), ^{
            NSLog(@"All done.");
        });
    }
    
    - (dispatch_group_t)group {
        if (!_group) {
            dispatch_group_t group = dispatch_group_create();
            _group = group;
        }
        return _group;
    }
    
    @end

    可能的输出:

    D done.
    A done.
    C done.
    E done.
    B done.
    All done.

    备注:
    dispatch_group_enter()与dispatch_group_leave()调用必须一一对应。

  • 相关阅读:
    主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
    Dubbo 分布式事务一致性实现
    微服务实现事务一致性实例
    微服务间保持事务一致性
    海量积分数据实时排名处理方式介绍二
    Java两种方法实现循环报数
    MySQL 千万级 数据库或大表优化
    Linux 中 Nginx 重启关闭
    Linux 中 Oracle dmp 文件导入导出
    Linux 中 Oracle 数据库启动和关闭
  • 原文地址:https://www.cnblogs.com/xwoder/p/5838191.html
Copyright © 2011-2022 走看看