UI进阶之多线程(GCD)

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
#pragma mark -- GCD串行队列--
    
    //系统提过的一个串行队列
    //使用系统提供串行队列(主线程队列)
    
   dispatch_queue_t queue = dispatch_get_main_queue();
    
    //创建一个串行队列
    //第一个参数: 系统提供好的一个宏
    //第二个参数: 系统保留字段 0
    
   dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);
  
#pragma mark -- 创建一个并行的队列--
    
    //使用系统提供的并行队列
    //DISPATCH_QUEUE_PRIORITY_BACKGROUND表示队列的优先级
    // 0 保留字段
    
   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    
    
    //创建一个并行队列
    //第一个参数: 表示这个队列的名字
    //第二个参数: 表示系统提供好的一个宏
   // dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    
    
    
    
    //使用dispatch_async 向队列中添加任务
    dispatch_async(queue, ^{
       
        NSLog(@"mian == %@, current == %@", [NSThread mainThread], [NSThread currentThread]);
        
    });
    
    
    
    dispatch_async(queue, ^{
        
        NSLog(@"mian1 == %@, current1 == %@", [NSThread mainThread], [NSThread currentThread]);
        
    });

    
    
    dispatch_async(queue, ^{
        
        NSLog(@"mian2 == %@, current2 == %@", [NSThread mainThread], [NSThread currentThread]);
        
    });

    
    dispatch_async(queue, ^{
        
        NSLog(@"mian3 == %@, current3 == %@", [NSThread mainThread], [NSThread currentThread]);
        
    });

    
    dispatch_async(queue, ^{
        
        NSLog(@"mian4 == %@, current4 == %@", [NSThread mainThread], [NSThread currentThread]);
        
    });

    
#pragma mark  -- 表示几秒之后做什么事情--
   
//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//        NSLog(@"已经3秒之后了");
//      
//    });
//    
    
    
#pragma mark -- 重复的向一个队列中添加一系列的任务--
    dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_SERIAL);
    
    dispatch_apply(3, queue, ^(size_t index) {
        
        NSLog(@"index == %zu", index);
        
    });
    
   
    
    
#pragma mark -- 分组--
    
    //创建一个分组
    dispatch_group_t group = dispatch_group_create();
    //创建一个队列
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    
    
    
    
    
    
    //向分组中添加一个任务
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第1个任务");
       
    });
    
   
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第2个任务");
        
    });
    
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第3个任务");
        
    });

    
    dispatch_group_async(group, queue, ^{
        NSLog(@"我是第4个任务");
        
    });
    
   
    //向分组添加结束任务
    //注意: 不要将结束任务放到第一个位置
    dispatch_group_notify(group, queue, ^{
        NSLog(@" 无论这样,我是最后一个任务");
    });

   
    
    
#pragma  mark -- 并发中的串行 (披着羊皮的狼)--
    
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"我是查询操作1");
    });

    
    dispatch_async(queue, ^{
        NSLog(@"我是查询操作2");
    });
    
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"我是插入操作");
    });

    
    dispatch_async(queue, ^{
        NSLog(@"我是查询操作3");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"我是查询操作4");
    });

    
}

MyObject类.m中

#import "MyObject.h"

static MyObject *object = nil;

@implementation MyObject

+ (MyObject *)shareMyObject
{
    
    static dispatch_once_t onceToken;
    
    //表示同一时间内只有一个线程可以访问block块里面的内容
    
    dispatch_once(&onceToken, ^{
        

    if (object == nil) {
        
        object = [[MyObject alloc]init];
        
    }
        
    });
    
    return object;
}
原文地址:https://www.cnblogs.com/huyibo/p/5371107.html