多线程 GCD
// DYFViewController.m
// 623-07-GCD
//
// Created by dyf on 14-6-23.
// Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved.
//
#import "DYFViewController.h"
@interface
DYFViewController ()
@property
(weak,
nonatomic
)
IBOutlet
UIImageView *iconView;
@end
@implementation
DYFViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
/*
// 异步:具备开启新线程的能力
dispatch_async(<#dispatch_queue_t queue#>, ^{
<#code#>
});
// 同步:不具备开启新线程的能力
dispatch_sync(<#dispatch_queue_t queue#>, ^{
<#code#>
})
*/
}
-(
void
)touchesBegan:(
NSSet
*)touches withEvent:(UIEvent *)event
{
[
self
testBackToMain];
}
- (
void
)testBackToMain {
// 获取全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 异步队列
dispatch_async(queue, ^{
NSLog
(@
"-----%@"
, [
NSThread
currentThread]);
// 下载图片
NSURL
*url = [
NSURL
URLWithString:path];
NSData
*data = [
NSData
dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// 回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
NSLog
(@
"-----------%@"
, [
NSThread
currentThread]);
self
.iconView.image = image;
});
});
}
- (
void
)testOnce {
static
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog
(@
"once"
);
});
}
- (
void
)testDelay {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 *
NSEC_PER_SEC
)), dispatch_get_main_queue(), ^{
NSLog
(@
"222"
);
});
}
/**
* 使用dispatch_async异步函数,在主线程中网主队列中添加任务
*/
- (
void
)testAsyncMainQueue {
// 1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.添加任务到队列中,执行任务
dispatch_async(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
// 总结:不开新线程
}
/**
* 使用dispatch_sync同步函数,在主线程中网主队列中添加任务,死:任务无法往下执行
*/
- (
void
)testSyncMainQueue {
// 1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.添加任务到队列中,执行任务
dispatch_sync(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
// 总结:不开新线程,所有任务在主线程中串行执行
}
// 凡是函数名中带有create、copy、new、retain等字眼,都需要在不需要使用这个数据的时候进行release
// GCD的数据类型在ARC环境下不需要再做release
// CF(Core Foundation)的数据类型在ARC环境下仍然要做release
- (
void
)testCF {
CFArrayRef array = CFArrayCreate(
NULL
,
NULL
, 11,
NULL
);
CFRelease(array);
}
/**
* 用dispatch_sync同步函数往串行队列中添加任务
*/
- (
void
)testSyncSerialQueue {
// 1.创建串行队列
dispatch_queue_t queue = dispatch_queue_create(
"cn.dongyue.queue"
,
NULL
);
// 2.添加任务到队列中,执行任务
dispatch_sync(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
dispatch_sync(queue, ^{
NSLog
(@
"---------2-----%@"
, [
NSThread
currentThread]);
});
dispatch_sync(queue, ^{
NSLog
(@
"---------3-----%@"
, [
NSThread
currentThread]);
});
// 3.释放(MRC)
//dispatch_release(queue);
// 总结:不会开新的线程
}
/**
* 用dispatch_sync同步函数往并发队列中添加任务
*/
- (
void
)testSyncGlobalQueue {
// 1.获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.添加任务到队列中,执行任务
dispatch_sync(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
dispatch_sync(queue, ^{
NSLog
(@
"---------2-----%@"
, [
NSThread
currentThread]);
});
dispatch_sync(queue, ^{
NSLog
(@
"---------3-----%@"
, [
NSThread
currentThread]);
});
// 总结:不会开启新的线程,并发队列失去了并发功能
}
/**
* 用dispatch_async同步函数往并发队列中添加任务
*/
- (
void
)testAsyncSerialQueue {
// 1.创建串行队列
dispatch_queue_t queue = dispatch_queue_create(
"cn.dongyue.queue"
,
NULL
);
// 2.添加任务到队列中,执行任务
dispatch_async(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
dispatch_async(queue, ^{
NSLog
(@
"---------2-----%@"
, [
NSThread
currentThread]);
});
dispatch_async(queue, ^{
NSLog
(@
"---------3-----%@"
, [
NSThread
currentThread]);
});
// 总结:只开1个新的线程,不会开启新的线程
}
/**
* 用dispatch_async同步函数往并发队列中添加任务
*/
- (
void
)testAsyncGlobalQueue {
// 1.获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.添加任务到队列中,执行任务
dispatch_async(queue, ^{
NSLog
(@
"---------1-----%@"
, [
NSThread
currentThread]);
});
dispatch_async(queue, ^{
NSLog
(@
"---------2-----%@"
, [
NSThread
currentThread]);
});
dispatch_async(queue, ^{
NSLog
(@
"---------3-----%@"
, [
NSThread
currentThread]);
});
// 总结:同时开启了3个线程
}
@end