首页 > 其他 > 详细

step 5 GCD (延时,执行一次)

时间:2016-01-01 20:59:06      阅读:148      评论:0      收藏:0      [点我收藏+]

一次性执行

有的时候,在程序开发中,有些代码只想从程序启动就只执行一次,典型的应用场景就是“单例”

// MARK: 一次性执行

- (void)once {

    static dispatch_once_t onceToken;

    NSLog(@"%ld", onceToken);

 

    dispatch_once(&onceToken, ^{

        [NSThread sleepForTimeInterval:1.0];

        NSLog(@"一次性吗?");

    });

    NSLog(@"come here");

}

  • dispatch 内部也有一把锁,是能够保证"线程安全"的!而且是苹果公司推荐使用的
  • 以下代码用于测试多线程的一次性执行

- (void)demoOnce {

    for (int i = 0; i < 10; ++i) {

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            [self once];

        });

    }

}

单例测试

单例的特点

1  在内存中只有一个实例

2  提供一个全局的访问点

单例实现

// 使用 dispatch_once 实现单例

+ (instancetype)sharedSingleton {

    static id instance;

 

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        instance = [[self alloc] init];

    });

 

    return instance;

}

 

// 使用互斥锁实现单例

+ (instancetype)sharedSync {

    static id syncInstance;

 

    @synchronized(self) {

        if (syncInstance == nil) {

            syncInstance = [[self alloc] init];

        }

    }

 

    return syncInstance;

}

面试时只要实现上面 sharedSingleton 方法即可

单例测试

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    long largeNumber = 1000 * 1000;

 

    // 测试互斥锁

    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();

    for (long i = 0; i < largeNumber; ++i) {

        [Singleton sharedSync];

    }

    NSLog(@"互斥锁: %f", CFAbsoluteTimeGetCurrent() - start);

 

    // 测试 dispatch_once

    start = CFAbsoluteTimeGetCurrent();

    for (long i = 0; i < largeNumber; ++i) {

        [Singleton sharedSingleton];

    }

    NSLog(@"dispatch_once: %f", CFAbsoluteTimeGetCurrent() - start);

}

 

延迟操作

// MARK: - 延迟执行

- (void)delay {

    /**

     从现在开始,经过多少纳秒,由"队列"调度异步执行 block 中的代码

 

     参数

     1. when    从现在开始,经过多少纳秒

     2. queue   队列

     3. block   异步执行的任务

     */

    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));

    void (^task)() = ^ {

        NSLog(@"%@", [NSThread currentThread]);

    };

    // 主队列

//    dispatch_after(when, dispatch_get_main_queue(), task);

    // 全局队列

//    dispatch_after(when, dispatch_get_global_queue(0, 0), task);

    // 串行队列

    dispatch_after(when, dispatch_queue_create("itheima", NULL), task);

 

    NSLog(@"come here");

}

 

- (void)after {

    [self.view performSelector:@selector(setBackgroundColor:) withObject:[UIColor orangeColor] afterDelay:1.0];

 

    NSLog(@"come here");

}

step 5 GCD (延时,执行一次)

原文:http://www.cnblogs.com/fakeCoder/p/5093687.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!