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

来源:互联网 发布:方正字体包for mac 编辑:程序博客网 时间:2024/05/17 08:16



////  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
原创粉丝点击