您的位置:首页 > 其它

GCD的简单使用<二>

2016-08-16 00:00 344 查看
1、多次执行的任务

dispatch_apply()函数将控制提交的代码块重复执行多次,提交给并发队列,系统可以使用多个线程并发的执行同一个代码块。

dispatch_apply(5, dispatch_get_global_queue(0, 0), ^(size_t time) {
NSLog(@" ----- %lu --- %@",time,[NSThread currentThread]);
});




程序启动了多个线程执行该代码块。

2、只执行一次的任务

dispatch_once()函数在整个应用的生命周期内最多只执行一次,只有第一次提交该代码块时,才会获得执行机会。dispatch_once()不需要传入队列,系统会直接在主线程执行该函数提交的代码块。

dispatch_once()函数需要传入一个dispatch_once_t类型的指针,用来判断该代码块是否已经执行过。

在程序中创建一个按钮,并绑定点击事件

- (IBAction)buttonClick:(id)sender {

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"是执行一次吗 ?");
});

}

只有第一次点击的时候会输出,然后再点击的话就不会有输出语句。当然如果重新运行程序的话,第一次点击还是会输出。

利用dispatch_once()函数创建单例

假设有个People,创建单例代码

+ (People *)sharedInstance {
static People *sharedPeopleInstance = nil;

static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedPeopleInstance = [[self alloc] init];
});

return sharedPeopleInstance;

}

这样可以保证线程的安全,不会因为多个线程同时调用sharedInstance方法而创建多个对象。

这种情况下调用alloc方法会发生什么呢?

People *peo1 = [People sharedInstance];
People *peo2 = [[People alloc]init];
NSLog(@" %p---- %p",peo1,peo2);




由结果看出这两个对象的内存地址是不一样的,这显然不符合单例的要求,解决这个问题,必须要重写People的alloc方法。

// 重写alloc 方法封堵创建方法(调用alloc方法时 默认会调用allocWithZone这个方法)
+ (id)allocWithZone:(struct _NSZone *)zone{
if (sharedPeopleInstance == nil) {
sharedPeopleInstance = [super allocWithZone:zone];
return sharedPeopleInstance;
}
return sharedPeopleInstance;
}

这样两种初始化方法得到的就是同一个对象,当然defaultPeople类似的初始化方法需要的话也可以自己去重写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: