多线程 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]);
         // 下载图片
         NSString *path = @ "http://image.cache.xiu8.com/live/125/125/997729.jpg" ;
         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

 
 

你可能感兴趣的:(多线程)