//你可以先看看這個例子的效果找點感覺,再看說明
@interface yxpGCDVController ()
{
UIImageView *_imageView;
}
@end
@implementation yxpGCDVController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title=@"GCD";
//初始化一_ImageView
_imageView=[[UIImageView alloc] initWithFrame:CGRectMake(10, 70, 300, 450)];
_imageView.backgroundColor=[UIColor grayColor];
_imageView.animationDuration=3.0;
_imageView.animationRepeatCount=0;
[self.view addSubview:_imageView];
//在後台異步執行隊列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *url1=@"http://h.hiphotos.baidu.com/image/w%3D230/sign=b2d5c289123853438ccf8022a311b01f/91ef76c6a7efce1b1ae9f92fad51f3deb58f6510.jpg";
NSString *url2=@"http://h.hiphotos.baidu.com/image/pic/item/d058ccbf6c81800aae834e8bb33533fa838b47d5.jpg";
NSString *url3=@"http://d.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec3ba65132ff5e0fe99257e1b.jpg";
NSString *url4=@"http://g.hiphotos.baidu.com/image/pic/item/a6efce1b9d16fdfa81f4ace4b68f8c5494ee7b1b.jpg";
NSString *url5=@"http://g.hiphotos.baidu.com/image/pic/item/d6ca7bcb0a46f21f70031fdbf4246b600c33ae07.jpg";
NSArray *array=[[NSArray alloc] initWithObjects:url1,url2,url3,url4,url5, nil];
NSMutableArray *imageArray=[[NSMutableArray alloc] initWithCapacity:20];
for (NSString *string in array) {
//下載圖片
NSLog(@"執行圖片下載函數");
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:string]];
UIImage *image = [UIImage imageWithData:data];
[imageArray addObject:image];
}
_imageView.animationImages=imageArray;
//回到主線程執行方法
dispatch_async(dispatch_get_main_queue(), ^{
[_imageView startAnimating];
});
});
}
@end
//GCD 的使用方式
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
async表明運行方式
queue則是你把任務交給那個線程隊列來處理
block代表的是你要做的事情
//線程運行方式
dispatch_async 異步執行
dispatch_sync 同步執行
dispatch_delay 延遲執行
...
//處理任務對象 dispatch queue(線程隊列)
一、dispatch_get_main_queue 主線程隊列(UI線程隊列)
二、dispatch_get_global_queue 並行線程隊列,由系統創建三個不同優先級的dispatch queue。並行隊列的執行順序與其加入隊列的順序相同。
三、串行隊列,一般用於按順序同步訪問,依次執行(順序由代碼先後覺得),可創建任意數量的串行隊列,各個串行隊列之間是並發的。
當想要任務按照某一個特定的順序執行時,串行隊列是很有用的。串行隊列在同一個時間只執行一個任務。我們可以使用串行隊列代替鎖去保護共享的數據。和鎖不同,一個串行隊列可以保證任務在一個可預知的順序下執行。
串行隊列通過dispatch_queue_create創建,可以使用函數dispatch_retain和dispatch_release去增加或者減少引用計數。
//dispatch queue叫線程隊列
dispatch_queue_create 用於創建用戶線程隊列。可以創建Serial/Concurrent Dispatch Queue 兩種隊列,即串行與並行隊列。
一、創建Serial Dispatch Queue。
dispatch_queue_t serialQueue =dispatch_queue_create("com.SerialQueue", NULL);
可以創建多個串行隊列,串行隊列也可以並行執行。決不能隨意的大量生產Serial Dispatch Queue。
二、創建Concurrent Dispatch Queue
dispatch_queue_t concurrentQueue =dispatch_queue_create("com.ConcurrentQueue",
DISPATCH_QUEUE_CONCURRENT);
Concurrent Dispatch Queue不過創建多少都沒有問題,因為Concurrent Dispatch Queue所使用的線程由系統的XNU內核高效管理,不會影響系統性能。
// 只執行一次的線程 一般用來寫單例模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
EG:
static SubObject *subobject = nil;
+ (SubObject *)sharedRequest
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
subobject = [[SubObject alloc]init];
});
return subobject;
}
// 延遲2秒執行線程
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
//線程匯總通知,等所有子線程(這個稱呼不准確,先代替了)執行完成後,才執行notify線程
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程一
for (int i=0; i<10; i++) {
NSLog(@"---------%i",i);
}
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程二
for (int i=10; i<20; i++) {
NSLog(@"+++++++++%i",i);
}
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 匯總結果
NSLog(@"完成");
});