zoukankan      html  css  js  c++  java
  • 多线程 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

     
     
  • 相关阅读:
    Android App Bundle 使用指南
    Homebrew国内源
    Mac下配置环境变量不生效问题
    CocosCreator1.x配置打包Android App Bundle
    Android读取Json文件的工具类
    Cocos Creator 坐标转换
    XCode真机调试不了,提示"Please reconnect the device"
    Canvas: trying to draw too large(134374464bytes) bitmap.
    Modbus主从关系几点记录
    当前时间加上几天
  • 原文地址:https://www.cnblogs.com/Cheetah-yang/p/4664151.html
Copyright © 2011-2022 走看看