美文网首页
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封装使用

  • iOS多线程-NSOperation

    NSOperation其实就是苹果对GCD的封装,把GCD封装成面向对象的编程,让开发者使用起来更加方便,简洁。 ...

  • NSOperation

    NSOperation是ios基于GCD的封装,实际上会使用GCD也就意味着会使用NSOperation,开发中个...

  • GCD 小总结

    简介:GCD是对多线程、多核开发较完整的封装。在使用GCD的时候,系统会自动根据CPU使用情况进行调度,所以GCD...

  • NSOperation&NSOperationQueue

    概述 NSOperation是对``GCD的封装,完全面向对象,使用起来更好理解。NSOperation对应GCD...

  • 多线程之NSOperation

    NSOperation介绍 NSOperation是 OC 语言中基于 GCD 的面向对象的封装。使用起来比GCD...

  • iOS NSThread NSOperation GCD的优缺点

    一、NSThread、 GCD、 NSOperation 抽象封装度层次从低到高,抽象封装度越高使用越简单。 二、...

  • IOS GCD使用指南

    全称:Grand Central Dispatch 简介:GCD是对多线程、多核开发的比较完整的封装。在使用GCD...

  • iOS多线程-NSOperation

    NSOperation是对GCD的高级封装。相对于GCD,使用NSOperation更加符合面对对象的编程习惯,更...

  • NSOperation

    NSOperation简介 是OC语言中基于GCD的面向对象的封装 使用起俩比GCD更加简单 提供了一些用GCD不...

网友评论

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

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