多线程创建 方法三: GCD 基础



//
//  RootViewController.m
//  GCD
//
//  Created by zm on 14-11-26.
//  Copyright (c) 2014年 practice. All rights reserved.
//

/**
 *    GCD 中的三种执行队列
 
 *  1.  dispatch_get_mainqueue() 串行队列(跟主线程相关,UI方面的操作需要加入到这个队列)
 
 *  2.  dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags)    并行队列
 
 *  3.  dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
 */

#import "RootViewController.h"

@interface RootViewController ()
{
    dispatch_queue_t _mainQueue;
    dispatch_queue_t _globalQueue;
    dispatch_queue_t _userQueue; //自定义队列

}
@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    /**
     *  获取跟主线程相关的执行队列
     *
     *  MainQueue 和 GlobalQueue 都是系统提供的
     *
     *  _userQueue 创建类型
     *  DISPATCH_QUEUE_SERIAL      串行
     *  DISPATCH_QUEUE_CONCURRENT  并行
     */
    _mainQueue = dispatch_get_main_queue();
    _globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //_userQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    _userQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    
    
    //以异步的方式把 block 加到队列中去
    
    dispatch_async(_globalQueue, ^{
        NSString *strUrl = @"http://p0.meituan.net/mmc/b5415ecd02850feaac07b5f1a95c040b46622.jpg";
        
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strUrl]];// NSData 同步方式请求数据
        
        // 嵌套主线程,在主线程中刷新 UI
        dispatch_async(_mainQueue, ^{
            UIImage *image = [UIImage imageWithData:data];
            UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
            imageView.frame = CGRectMake(100, 100, 100, 100);
            
            [self.view addSubview:imageView];
        });
        
    });
    
    [self method_MainQueue];
}

-(void)method_GlobalQueue
{
    /**
     *  并行队列,支持并行和串行,取决于你的使用方式
     *  dispatch_sync   串行
     *  dispatch_async  并行
     */
    
    dispatch_async(_globalQueue, ^{
        NSLog(@"A");
    });
    
    dispatch_async(_globalQueue, ^{
        NSLog(@"B");
    });
    
    
    dispatch_sync(_globalQueue, ^{
        NSLog(@"C");
    });
    
    
    /**
     *
     */
    dispatch_sync(_globalQueue, ^{
        NSLog(@"A");
    });
    
    dispatch_sync(_globalQueue, ^{
        NSLog(@"B");
    });
    
    dispatch_sync(_globalQueue, ^{
        NSLog(@"C");
    });
    
}

-(void)method_MainQueue
{
    /**
     *  _mainQueue  只支持串行,跟调用方式无关
     *  dispatch_async ,dispatch_sync  均是按顺序执行
     */
    
    dispatch_async(_mainQueue, ^{
        NSLog(@"E");
    });
    
    dispatch_async(_mainQueue, ^{
        NSLog(@"F");
    });
    
    dispatch_async(_mainQueue, ^{
        NSLog(@"G");
    });
    
}

-(void)method_UserQueue
{
    /**
     *  由创建时的类型决定是否支持串行,并行
     *
     */
    
    dispatch_async(_userQueue, ^{
        NSLog(@"I");
    });
    
    dispatch_async(_userQueue, ^{
        NSLog(@"J");
    });

    dispatch_async(_userQueue, ^{
        NSLog(@"K");
    });

    dispatch_async(_userQueue, ^{
        NSLog(@"L");
    });
    
    
    //
    dispatch_sync(_userQueue, ^{
        NSLog(@"I");
    });
    
    dispatch_sync(_userQueue, ^{
        NSLog(@"J");
    });
    
    dispatch_sync(_userQueue, ^{
        NSLog(@"K");
    });
    
    dispatch_sync(_userQueue, ^{
        NSLog(@"L");
    });

    
}


@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值