美文网首页
9.7、GCD封装使用

9.7、GCD封装使用

作者: 艾希_可可 | 来源:发表于2018-07-31 16:35 被阅读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
    
    

    相关文章

      网友评论

          本文标题:9.7、GCD封装使用

          本文链接:https://www.haomeiwen.com/subject/tuphvftx.html