GCD使用(四)操作只执行一次

来源:互联网 发布:mac终端命令 编辑:程序博客网 时间:2024/05/16 07:05

1。dispatch_once ( &dispatch_once_t , block )

e.g.

static dispatch_once_t onceToken;

void (^executedOnlyOnce)(void) = ^{  

    static NSUInteger numberOfEntries = 0;

    numberOfEntries++;

    NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);    

};

-(void)action{    

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    

    dispatch_once(&onceToken, ^{

        dispatch_async(concurrentQueue,  executedOnlyOnce);

    });    

   

    dispatch_once(&onceToken, ^{

        dispatch_async(concurrentQueue, executedOnlyOnce); //executedOnlyOnce不执行

    });

}

2。单例的使用

@implementation MySingleton

+(instancetype) sharedInstance{

    static MySingleton *SharedInstance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        SharedInstance = [MySingleton new];  //保证只被实例化一次

    });

    return SharedInstance;

}

@end


postscript:

  id 和 instancetype 区别:对于类方法的返回类型,使用instancetype更合适,它能保证编译器正确推断方法的返回类型,但instancetype不能做参数

                         使用id时,本质上是不会作类型检查,对于alloc,init返回类本身类型时还是有用




0 0
原创粉丝点击