标签:
- (void)viewDidLoad {
[super viewDidLoad];
/*GCD:Grand Central Dispatch 牛逼的中枢调度器,自动管理线程的生命周期(创建 调度 销毁)。将任务存放到队列中,GCD会自动将队列中的任务取出,先进先出,放到线程中执行。
同步执行任务:在当前线程中执行 dispatch_sync(dispatch_queue_t queue,dispatch_block_t block)
异步执行任务:在其他线程执行 dispatch_async(...)
队列dispatch_queue_t:
并发队列(开启多个线程执行多个任务,只在异步执行有效):默认提供,不需要手动创建 全局并发队列 dispatch_get_global_queue(dispatch_queue_priority_t priority,0);
串行队列:创建 dispatch_queue_creat(‘名称’,属性NULL)
主队列(主线程相关联) dispatch_get_main_queue()
开不开启新线程还得看执行任务的方式
*/
/*
主队列是与主线程相关的串行队列,只会在主线程执行,与执行方式无关,一般使用异步方式。
子线程拿数据,主线程展示。转到主线程的方式:1.直接转2.放到主队列里
*/
/*
延迟执行:1.调用NSObject [self performSelector: withObject: afterDelay:2.0];方法在哪个线程调用,那么延迟执行的方法就在那个线程执行
2.使用GCD dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);什么时间,执行这个队列的这个任务。(主队列就在主线程,并发队列就新建线程)
例子:dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{
*/
/*
实现一次性代码:dispatch_once函数
例子:static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
整个程序运行过程中,只会执行一次。
*/
/*
队列组:可以让两个任务同时进行,切当两个任务都完成时,再做其他事。异步做几个耗时的事,等完事要回到主线程时用队列组。
创建一个组 dispatch_group_t group = dispatch_group_create();
开启一个任务 dispatch_group_async(group,全局并发队列,^{});
开启其他任务 dispatch_group_async(group,全局并发队列,^{})
执行所有任务
完事后回到主线程 dispatch_group_notify(group,主线程,^{});
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSString *imageStrring = [NSString stringWithFormat:@"http://i6.topit.me/6/5d/45/1131907198420455d6o.jpg"];
NSURL *imageUrl = [NSURL URLWithString:imageStrring];
NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
self.image = [UIImage imageWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = self.image;
});
});
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(40, 40, 100, 100);
[button setTitle:@"Click" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor redColor]];
[button addTarget:self action:@selector(clicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)clicked
{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(40, 140, 300, 300)];
imageView.image = self.image;
[self.view addSubview:imageView];
}
标签:
原文地址:http://www.cnblogs.com/haugezi/p/4856331.html