//
// RootViewController.m
// GCD
//
// Created by zm on 14-11-26.
// Copyright (c) 2014年 practice. All rights reserved.
//
/**
* GCD 中的三种执行队列
* 1. dispatch_get_mainqueue() 串行队列(跟主线程相关,UI方面的操作需要加入到这个队列)
* 2. dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags) 并行队列
* 3. dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
*/
#import "RootViewController.h"
@interface RootViewController ()
{
dispatch_queue_t _mainQueue;
dispatch_queue_t _globalQueue;
dispatch_queue_t _userQueue; //自定义队列
}
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
/**
* 获取跟主线程相关的执行队列
*
* MainQueue 和 GlobalQueue 都是系统提供的
*
* _userQueue 创建类型
* DISPATCH_QUEUE_SERIAL 串行
* DISPATCH_QUEUE_CONCURRENT 并行
*/
_mainQueue = dispatch_get_main_queue();
_globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//_userQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
_userQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
//以异步的方式把 block 加到队列中去
dispatch_async(_globalQueue, ^{
NSString *strUrl = @"http://p0.meituan.net/mmc/b5415ecd02850feaac07b5f1a95c040b46622.jpg";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strUrl]];// NSData 同步方式请求数据
// 嵌套主线程,在主线程中刷新 UI
dispatch_async(_mainQueue, ^{
UIImage *image = [UIImage imageWithData:data];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(100, 100, 100, 100);
[self.view addSubview:imageView];
});
});
[self method_MainQueue];
}
-(void)method_GlobalQueue
{
/**
* 并行队列,支持并行和串行,取决于你的使用方式
* dispatch_sync 串行
* dispatch_async 并行
*/
dispatch_async(_globalQueue, ^{
NSLog(@"A");
});
dispatch_async(_globalQueue, ^{
NSLog(@"B");
});
dispatch_sync(_globalQueue, ^{
NSLog(@"C");
});
/**
*
*/
dispatch_sync(_globalQueue, ^{
NSLog(@"A");
});
dispatch_sync(_globalQueue, ^{
NSLog(@"B");
});
dispatch_sync(_globalQueue, ^{
NSLog(@"C");
});
}
-(void)method_MainQueue
{
/**
* _mainQueue 只支持串行,跟调用方式无关
* dispatch_async ,dispatch_sync 均是按顺序执行
*/
dispatch_async(_mainQueue, ^{
NSLog(@"E");
});
dispatch_async(_mainQueue, ^{
NSLog(@"F");
});
dispatch_async(_mainQueue, ^{
NSLog(@"G");
});
}
-(void)method_UserQueue
{
/**
* 由创建时的类型决定是否支持串行,并行
*
*/
dispatch_async(_userQueue, ^{
NSLog(@"I");
});
dispatch_async(_userQueue, ^{
NSLog(@"J");
});
dispatch_async(_userQueue, ^{
NSLog(@"K");
});
dispatch_async(_userQueue, ^{
NSLog(@"L");
});
//
dispatch_sync(_userQueue, ^{
NSLog(@"I");
});
dispatch_sync(_userQueue, ^{
NSLog(@"J");
});
dispatch_sync(_userQueue, ^{
NSLog(@"K");
});
dispatch_sync(_userQueue, ^{
NSLog(@"L");
});
}
@end