标签:
使用GCD函数可以进行延时操作,该函数为
-
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
-
});
现在我们来分解一下参数
dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(delayInSeconds *NSEC_PER_SEC)) :
NSEC_PER_SEC在头文件中的定义如下:
#define NSEC_PER_SEC 1000000000ull /*
nanoseconds per second */
该参数表示从现在开始经过多少纳秒
dispatch_get_main_queue():表示主队列
^{
}:表示一个block任务。
我们可以来测试一下经过多少纳秒之后,由主队列调度任务是异步执行还是同步执行,代码如下:
-
-
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
-
-
void (^task)() = ^ {
-
-
NSLog(@"%@", [NSThread currentThread]);
-
};
-
-
dispatch_after(when, dispatch_get_main_queue(), task);
-
-
NSLog(@"come here");
执行结果如下:
由此可见主队列中调度任务是异步执行的
再将执行队列改为全局队列和串行队列,得到的结果完全是一样的,由此可知该函数执行的是异步操作。
GCD中有个函数能够保证某段代码在程序运行过程中只被执行1次!该函数如下:
-
static dispatch_once_t onceToken;
-
dispatch_once(&onceToken, ^{
-
-
})
dispatch_once_t在头文件中得定义如下:
typedef long dispatch_once_t;
由此可知该类型是个long类型。当onceToken等于0时就会执行block代码。dispatch_once是线程安全的,只要涉及到线程安全就会涉及到锁,dispatch_once内部也有一把锁,性能比互斥锁高!
利用该函数我们可以来写一个单例模式
单例模式可以保证在程序运行过程,一个类只有一个实例且该实例易于供外界访问,从而方便控制实例个数,并节约系统资源,当应用程序需要共享一份资源时就可以用单例模式来实现。单例模式分ARC与MRC两种情况,我们可以用宏判断是否为ARC环境
-
#if __has_feature(objc_arc)
-
-
#else
-
-
#endif
ARC环境下简单地单例模式:
-
@implementation SoundTools
-
-
static id instance;
-
-
-
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
-
static dispatch_once_t onceToken;
-
dispatch_once(&onceToken, ^{
-
instance = [super allocWithZone:zone];
-
});
-
return instance;
-
}
-
-
-
+ (instancetype)sharedSoundTools {
-
static dispatch_once_t onceToken;
-
dispatch_once(&onceToken, ^{
-
instance = [[self alloc] init];
-
});
-
return instance;
-
}
-
-
- (id)copyWithZone:(NSZone *)zone {
-
return instance;
-
}
-
@end
-
-
测试代码如下:
-
- (void)viewDidLoad {
-
[super viewDidLoad];
-
-
SoundTools *s1 = [SoundTools sharedSoundTools];
-
NSLog(@"%p", s1);
-
}
-
-
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
-
SoundTools *s2 = [SoundTools sharedSoundTools];
-
-
NSLog(@"%p", s2);
-
}
两个方法打印出来的地址完全一样!
在MRC环境下有如下代码:
-
-
static id instance;
-
-
-
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
-
static dispatch_once_t onceToken;
-
dispatch_once(&onceToken, ^{
-
instance = [super allocWithZone:zone];
-
});
-
return instance;
-
}
-
-
-
+ (instancetype)sharedSoundTools {
-
static dispatch_once_t onceToken;
-
dispatch_once(&onceToken, ^{
-
instance = [[self alloc] init];
-
});
-
return instance;
-
}
-
-
- (id)copyWithZone:(NSZone *)zone {
-
return instance;
-
}
-
-
#pragma mark - MRC内存管理方法
-
-
-
-
-
- (oneway void)release {
-
-
}
-
-
-
- (instancetype)retain {
-
return instance;
-
}
-
-
-
- (instancetype)autorelease {
-
return instance;
-
}
-
-
-
- (NSUInteger)retainCount {
-
-
return ULONG_MAX;
-
}
ios多线程操作(七)—— GCD延迟操作与一次性代码
标签:
原文地址:http://blog.csdn.net/wuwuweiweilonglong/article/details/51167206