zoukankan      html  css  js  c++  java
  • GCD编程(封装GCD)

    //GCDGroup 类

    @interface GCDGroup : NSObject

    @property (strongnonatomicreadonlydispatch_group_t dispatchGroup;


    #pragma 初始化以及释放

    - (instancetype)init;


    #pragma 使用方法

    - (void)enter;

    - (void)leave;

    - (void)wait;

    - (BOOL)wait:(int64_t)delta;

    @end


    #import "GCDGroup.h"

    @interface GCDGroup ()

    @property (strongnonatomicreadwritedispatch_group_t dispatchGroup;

    @end


    @implementation GCDGroup


    - (instancetype)init {

        self = [super init];

        if (self) {

            self.dispatchGroup = dispatch_group_create();

        }

        return self;

    }


    - (void)enter {

        dispatch_group_enter(self.dispatchGroup);

    }


    - (void)leave {

        dispatch_group_leave(self.dispatchGroup);

    }


    - (void)wait {

        dispatch_group_wait(self.dispatchGroupDISPATCH_TIME_FOREVER);

    }


    - (BOOL)wait:(int64_t)delta {

        return dispatch_group_wait(self.dispatchGroup,

                                   dispatch_time(DISPATCH_TIME_NOW, delta)) == 0;

    }


    @end



    //GCDQueue 类


    @class GCDGroup;


    @interface GCDQueue : NSObject


    @property (strongreadonlynonatomicdispatch_queue_t dispatchQueue;


    + (GCDQueue *)mainQueue;

    + (GCDQueue *)globalQueue;

    + (GCDQueue *)highPriorityGlobalQueue;

    + (GCDQueue *)lowPriorityGlobalQueue;

    + (GCDQueue *)backgroundPriorityGlobalQueue;


    #pragma 便利的构造方法

    + (void)executeInMainQueue:(dispatch_block_t)block;

    + (void)executeInGlobalQueue:(dispatch_block_t)block;

    + (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block;

    + (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block;

    + (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block;

    + (void)executeInMainQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

    + (void)executeInGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

    + (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

    + (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;

    + (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec;


    #pragma 初始化以及释放

    - (instancetype)init;

    - (instancetype)initSerial;

    - (instancetype)initConcurrent;


    #pragma 使用方法

    - (void)execute:(dispatch_block_t)block;

    - (void)execute:(dispatch_block_t)block afterDelay:(int64_t)delta;

    - (void)waitExecute:(dispatch_block_t)block;

    - (void)barrierExecute:(dispatch_block_t)block;

    - (void)waitBarrierExecute:(dispatch_block_t)block;

    - (void)suspend;

    - (void)resume;


    #pragma GCDGroup相关

    - (void)execute:(dispatch_block_t)block inGroup:(GCDGroup *)group;

    - (void)notify:(dispatch_block_t)block inGroup:(GCDGroup *)group;


    @end


    #import "GCDQueue.h"

    #import "GCDGroup.h"


    static GCDQueue *mainQueue;

    static GCDQueue *globalQueue;

    static GCDQueue *highPriorityGlobalQueue;

    static GCDQueue *lowPriorityGlobalQueue;

    static GCDQueue *backgroundPriorityGlobalQueue;


    @interface GCDQueue ()

    @property (strongreadwritenonatomicdispatch_queue_t dispatchQueue;

    @end


    @implementation GCDQueue


    + (GCDQueue *)mainQueue {

        return mainQueue;

    }


    + (GCDQueue *)globalQueue {

        return globalQueue;

    }


    + (GCDQueue *)highPriorityGlobalQueue {

        return highPriorityGlobalQueue;

    }


    + (GCDQueue *)lowPriorityGlobalQueue {

        return lowPriorityGlobalQueue;

    }


    + (GCDQueue *)backgroundPriorityGlobalQueue {

        return backgroundPriorityGlobalQueue;

    }


    + (void)initialize {

        /**

         Initializes the class before it receives its first message.

         

         1. The runtime sends the initialize message to classes in a

         thread-safe manner.

         

         2. initialize is invoked only once per class. If you want to

         perform independent initialization for the class and for

         categories of the class, you should implement load methods.

         */

        if (self == [GCDQueue self])  {

            mainQueue = [GCDQueue new];

            mainQueue.dispatchQueue =

            dispatch_get_main_queue();

            

            globalQueue = [GCDQueue new];

            globalQueue.dispatchQueue =

            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT0);

            

            highPriorityGlobalQueue = [GCDQueue new];

            highPriorityGlobalQueue.dispatchQueue =

            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH0);

            

            lowPriorityGlobalQueue = [GCDQueue new];

            lowPriorityGlobalQueue.dispatchQueue =

            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW0);

            

            backgroundPriorityGlobalQueue = [GCDQueue new];

            backgroundPriorityGlobalQueue.dispatchQueue =

            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND0);

        }

    }


    - (instancetype)init {

        return [self initSerial];

    }


    - (instancetype)initSerial {

        self = [super init];

        if (self)

        {

            self.dispatchQueue = dispatch_queue_create(nilDISPATCH_QUEUE_SERIAL);

        }

        return self;

    }


    - (instancetype)initConcurrent {

        self = [super init];

        if (self)

        {

            self.dispatchQueue = dispatch_queue_create(nilDISPATCH_QUEUE_CONCURRENT);

        }

        return self;

    }


    - (void)execute:(dispatch_block_t)block {

        dispatch_async(self.dispatchQueue, block);

    }


    - (void)execute:(dispatch_block_t)block afterDelay:(int64_t)delta {

        // NSEC_PER_SEC

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delta), self.dispatchQueue, block);

    }


    - (void)waitExecute:(dispatch_block_t)block {

        /*

         As an optimization, this function invokes the block on

         the current thread when possible.

         

         作为一个建议,这种方法尽量在当前线程池中调用.

         */

        dispatch_sync(self.dispatchQueue, block);

    }


    - (void)barrierExecute:(dispatch_block_t)block {

        /*

         The queue you specify should be a concurrent queue that you

         create yourself using the dispatch_queue_create function.

         If the queue you pass to this function is a serial queue or

         one of the global concurrent queues, this function behaves

         like the dispatch_async function.

         

         使用的线程池应该是你自己创建的并发线程池.假设你传进来的參数为串行线程池

         或者是系统的并发线程池中的某一个,这种方法就会被当做一个普通的async操作

         */

        dispatch_barrier_async(self.dispatchQueue, block);

    }


    - (void)waitBarrierExecute:(dispatch_block_t)block {

        /*

         The queue you specify should be a concurrent queue that you

         create yourself using the dispatch_queue_create function.

         If the queue you pass to this function is a serial queue or

         one of the global concurrent queues, this function behaves

         like the dispatch_sync function.

         

         使用的线程池应该是你自己创建的并发线程池.假设你传进来的參数为串行线程池

         或者是系统的并发线程池中的某一个,这种方法就会被当做一个普通的sync操作

         

         As an optimization, this function invokes the barrier block

         on the current thread when possible.

         

         作为一个建议,这种方法尽量在当前线程池中调用.

         */

        

        dispatch_barrier_sync(self.dispatchQueue, block);

    }


    - (void)suspend {

        dispatch_suspend(self.dispatchQueue);

    }


    - (void)resume {

        dispatch_resume(self.dispatchQueue);

    }


    - (void)execute:(dispatch_block_t)block inGroup:(GCDGroup *)group {

        dispatch_group_async(group.dispatchGroupself.dispatchQueue, block);

    }


    - (void)notify:(dispatch_block_t)block inGroup:(GCDGroup *)group {

        dispatch_group_notify(group.dispatchGroupself.dispatchQueue, block);

    }



    #pragma mark - 便利的构造方法

    + (void)executeInMainQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec {

        [[GCDQueue mainQueueexecute:^{

            block();

        } afterDelay:NSEC_PER_SEC * sec];

    }


    + (void)executeInGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec {

        [[GCDQueue globalQueueexecute:^{

            block();

        } afterDelay:NSEC_PER_SEC * sec];

    }


    + (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec {

        [[GCDQueue highPriorityGlobalQueueexecute:^{

            block();

        } afterDelay:NSEC_PER_SEC * sec];

    }


    + (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec {

        [[GCDQueue lowPriorityGlobalQueueexecute:^{

            block();

        } afterDelay:NSEC_PER_SEC * sec];

    }


    + (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block afterDelaySecs:(NSTimeInterval)sec {

        [[GCDQueue backgroundPriorityGlobalQueueexecute:^{

            block();

        } afterDelay:NSEC_PER_SEC * sec];

    }


    + (void)executeInMainQueue:(dispatch_block_t)block {

        [[GCDQueue mainQueueexecute:^{

            block();

        }];

    }


    + (void)executeInGlobalQueue:(dispatch_block_t)block {

        [[GCDQueue globalQueueexecute:^{

            block();

        }];

    }


    + (void)executeInHighPriorityGlobalQueue:(dispatch_block_t)block {

        [[GCDQueue highPriorityGlobalQueueexecute:^{

            block();

        }];

    }


    + (void)executeInLowPriorityGlobalQueue:(dispatch_block_t)block {

        [[GCDQueue lowPriorityGlobalQueueexecute:^{

            block();

        }];

    }


    + (void)executeInBackgroundPriorityGlobalQueue:(dispatch_block_t)block {

        [[GCDQueue backgroundPriorityGlobalQueueexecute:^{

            block();

        }];

    }


    //3 GCDSemaphore 类


    @interface GCDSemaphore : NSObject


    @property (strongreadonlynonatomicdispatch_semaphore_t dispatchSemaphore;


    #pragma 初始化以及释放

    - (instancetype)init;

    - (instancetype)initWithValue:(long)value;


    #pragma 使用方法

    - (BOOL)signal;

    - (void)wait;

    - (BOOL)wait:(int64_t)delta;


    @end


    #import "GCDSemaphore.h"


    @interface GCDSemaphore ()

    @property (strongreadwritenonatomicdispatch_semaphore_t dispatchSemaphore;

    @end


    @implementation GCDSemaphore

    - (instancetype)init {

        self = [super init];

        if (self) {

            self.dispatchSemaphore = dispatch_semaphore_create(0);

        }

        return self;

    }


    - (instancetype)initWithValue:(long)value {

        self = [super init];

        if (self) {

            self.dispatchSemaphore = dispatch_semaphore_create(value);

        }

        return self;

    }


    - (BOOL)signal {

        return dispatch_semaphore_signal(self.dispatchSemaphore) != 0;

    }


    - (void)wait {

        dispatch_semaphore_wait(self.dispatchSemaphoreDISPATCH_TIME_FOREVER);

    }


    - (BOOL)wait:(int64_t)delta {

        return dispatch_semaphore_wait(self.dispatchSemaphoredispatch_time(DISPATCH_TIME_NOW, delta)) == 0;

    }


    //4 GCDTimer

    class GCDQueue;


    @interface GCDTimer : NSObject


    @property (strongreadonlynonatomicdispatch_source_t dispatchSource;


    #pragma 初始化以及释放

    - (instancetype)init;

    - (instancetype)initInQueue:(GCDQueue *)queue;


    #pragma 使用方法

    - (void)event:(dispatch_block_t)block timeInterval:(uint64_t)interval;

    - (void)start;

    - (void)destroy;



    @end


    #import "GCDTimer.h"

    #import "GCDQueue.h"


    @interface GCDTimer ()

    @property (strongreadwritenonatomicdispatch_source_t dispatchSource;

    @end


    @implementation GCDTimer


    - (instancetype)init

    {

        self = [super init];

        if (self) {

            self.dispatchSource =

            dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER00dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT0));

        }

        return self;

    }


    - (instancetype)initInQueue:(GCDQueue *)queue {

        self = [super init];

        if (self) {

            self.dispatchSource =

            dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER00, queue.dispatchQueue);

        }

        return self;

    }


    - (void)event:(dispatch_block_t)block timeInterval:(uint64_t)interval {

        dispatch_source_set_timer(self.dispatchSource,

                                  dispatch_time(DISPATCH_TIME_NOW0),

                                  interval,

                                  0);

        

        dispatch_source_set_event_handler(self.dispatchSource, ^{

            block();

        });

    }


    - (void)start {

        dispatch_resume(self.dispatchSource);

    }


    - (void)destroy {

        dispatch_source_cancel(self.dispatchSource);

    }


    //GCD.h

    #import "GCDQueue.h"

    #import "GCDGroup.h"

    #import "GCDSemaphore.h"

    #import "GCDTimer.h"



  • 相关阅读:
    VBS发送邮件-1
    docker命令
    NLP | 自然语言处理
    windows: Python安装scipy,scikit-image时提示"no lapack/blas resources found"的解决方法
    Sense2vec with spaCy and Gensim
    python 去停用词
    nohup command > myout.file 2>&1 &
    NLTK vs SKLearn vs Gensim vs TextBlob vs spaCy
    Gensim进阶教程:训练word2vec与doc2vec模型
    Gensim入门教程
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7210663.html
Copyright © 2011-2022 走看看