• 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;
    }
  • 相关阅读:
    JS实现双击内容变为可编辑状态
    DataTables 1.10.x与1.9.x参数名对照表
    div里 datapicker显示异常的情况之一
    javascript 添加行,删除行,datepicker获取当前日期和上一个月日期并设置格式,笔记
    jQuery 实现添加表格行,删除行,调用日期控件
    c# webbrowser控件内核版本强制修改
    【.net】获取网页CDM的下载链接的地址
    MySQL 密码增强插件
    跟我一起学extjs5(42--单个模块的数据新增方式)
    给 Android 开发人员的 RxJava 具体解释
  • 原文地址:https://www.cnblogs.com/huyibo/p/5371107.html
Copyright © 2020-2023  润新知