首页 > 代码库 > iOS多线程开发小demo6 GCD

iOS多线程开发小demo6 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