9.7、GCD封装使用

2018-07-31  本文已影响13人  艾希_可可
//
//  YEGCDManager.h
//  ModaiTreasure
//
//  Created by hsz on 16/5/12.
//  Copyright © 2016年 hsz. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface YEGCDManager : NSObject

/**
 *  1.只执行一次
 *
 *  @param oncePerform 事件
 */
//@property(nonatomic,copy)void (^changBlock)(void);
+ (void)gcd_oncePerform:(void(^)(void))oncePerform;

/**
 *  2.分组: dispatch_group_notify
 *
 *  @param firstEvent        第一个异步
 *  @param secondEvent       第二个异步
 *  @param thirdEvent        第三个异步
 *  @param group_notifyEvent 全部执行完之后再执行
 */
+ (void)gcd_groupPerform:(void (^)(void))firstEvent
             secondEvent:(void (^)(void))secondEvent
              thridEvent:(void (^)(void))thirdEvent
       group_notifyEvent:(void (^)(void))group_notifyEvent;



// *  3.分段: dispatch_barrier_async
// *
// *  @param firstEvent @param secondEvent  前两个执行
// *  @param barrierEvent 然后执行
// *  @param thirdEvent   最后执行
+ (void)gcd_barrierPerform:(void (^)(void))firstEvent
               secondEvent:(void (^)(void))secondEvent
              barrierEvent:(void (^)(void))barrierEvent
                thridEvent:(void (^)(void))thirdEvent;

/**
 *  4.重复执行
 *
 *  @param timer 次数
 *  @param event 事件
 */
+ (void)gcd_applyPerformTimes:(NSInteger)timer
                        event:(void (^)())event;


/**
 *  5.延时执行
 *
 *  @param time  时间
 *  @param event 事件
 */
+ (void)gcd_afterPerformTimer:(float)time
                        event:(void (^)(void))event;

/**
 *  6.主线程
 *
 *  @param event 事件
 */
+ (void)gcd_mainPerformEvent:(void (^)(void))event;

/**
 *  7.异步执行
 *
 *  @param event 事件
 */
+ (void)gcd_asyncPerformEvent:(void (^)(void))event;


@end

//
//  YEGCDManager.m
//  ModaiTreasure
//
//  Created by hsz on 16/5/12.
//  Copyright © 2016年 hsz. All rights reserved.
//

#import "YEGCDManager.h"

@implementation YEGCDManager

/**
 *  1.只执行一次
 *
 *  @param oncePerform 事件
 */
+ (void)gcd_oncePerform:(void(^)(void))oncePerform {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, oncePerform);
}

/**
 *  2.分组: dispatch_group_notify
 *
 *  @param firstEvent        第一个异步
 *  @param secondEvent       第二个异步
 *  @param thirdEvent        第三个异步
 *  @param group_notifyEvent 全部执行完之后再执行
 */
+ (void)gcd_groupPerform:(void (^)(void))firstEvent
             secondEvent:(void (^)(void))secondEvent
              thridEvent:(void (^)(void))thirdEvent
       group_notifyEvent:(void (^)(void))group_notifyEvent{
    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, firstEvent);
    
    if (secondEvent) {
        dispatch_group_async(group, queue, secondEvent);
    }
    if (thirdEvent) {
        dispatch_group_async(group, queue, thirdEvent);
    }
    
    dispatch_group_notify(group, queue, group_notifyEvent);
}

// *  3.分段: dispatch_barrier_async
// *
// *  @param firstEvent @param secondEvent  前两个执行
// *  @param barrierEvent 然后执行
// *  @param thirdEvent   最后执行
+ (void)gcd_barrierPerform:(void (^)(void))firstEvent
               secondEvent:(void (^)(void))secondEvent
              barrierEvent:(void (^)(void))barrierEvent
                thridEvent:(void (^)(void))thirdEvent{
    
    dispatch_queue_t queue = dispatch_queue_create("YEGCDManager.queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, firstEvent);
    
    if (secondEvent) {
        dispatch_async(queue, secondEvent);
    }
    
    if (barrierEvent) {
        dispatch_barrier_async(queue, barrierEvent);
    }
    
    if (thirdEvent) {
        dispatch_async(queue, thirdEvent);
    }
}

/**
 *  4.重复执行
 *
 *  @param timer 次数
 *  @param event 事件
 */
+ (void)gcd_applyPerformTimes:(NSInteger)timer event:(void (^)())event {
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        dispatch_apply(timer, queue, event);
    });
}

/**
 *  5.延时执行
 *
 *  @param time  时间
 *  @param event 事件
 */
+ (void)gcd_afterPerformTimer:(float)time event:(void (^)(void))event {
    
    double delayInSeconds = time;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), event);
}

/**
 *  6.主线程
 *
 *  @param event 事件
 */
+ (void)gcd_mainPerformEvent:(void (^)(void))event {
    
    dispatch_async(dispatch_get_main_queue(), event);
}

/**
 *  7.全局队列异步执行
 *
 *  @param event 事件
 */
+ (void)gcd_asyncPerformEvent:(void (^)(void))event {
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, event);
}

@end

上一篇 下一篇

猜你喜欢

热点阅读