zoukankan      html  css  js  c++  java
  • ios

    首先GCD两个名词: 队列 同步异步.

    队列: 任务放到队列,队列中的任务执行方式取决于执行队列中任务的方式---同步异步.

    串行队列: 任务顺序执行,可以叫阻塞队列.只有前面任务完成才执行后面的.

    并发队列: 开启新的线程执行任务,不会阻塞主线程.

    同步异步:是队列中任务执行的方式,同步也就是任务在一个线程中顺序执行属于会'阻塞'主线程,异步:不会阻塞主线程,可以开启新线程.

    
    dispatch_sync(queue, block) //同步执行
    dispatch_async (queue, block) //异步执行
    dispatch_after(time, queue, block) //同步延迟执行
    
    
    

    queue第一个参数,"队列",有三种:全局队列,主队列,自己创建的队列.

    全局队列:默认是并发队列,---可以开启新线程

    
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    
    

    并发队列第一个参数是在全局队列的优先级. 有 默认 , 高, 低,后台 四种

    主队列: 串行队列

    自己创建的队列:

    
    dispatch_queue_create("com.hello", NULL)
    
    
    

    第二个参数 NULL 代表创建的是串行队列.如果是DISPATCHQUEUECONCURRENT 代表并发队列(ios 4.3以后出现的)


    线程是不安全的,多个线程在访问系统同一资源的时候会造成想不到的错误:例如银行存取钱,买票 案例

    解决办法就是给线程加上锁,自带内部同步锁,或者自己创建一个同步锁,下面演示自己创建的同步锁

    _syncQueue = dispatch_queue_create("com.effectiveObjectiveC.syncQueue", NULL);
    - (NSString *)someString
    {
        __weak NSString *localSomeString;
        dispatch_sync(_syncQueue, ^{
            localSomeString = _someString;
        });
        return localSomeString;
    }
    - (void)setSomeString:(NSString *)someString
    {
        dispatch_sync(_syncQueue, ^{
            _someString = someString;
        });
    }
    
    
  • 相关阅读:
    postgresql创建表
    PG查询数据库大小
    unicode字符集范围
    删除mysql数据中的空格和换行符
    无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
    ubuntu 16.04 64位 coreseek
    linux wps 缺失字体问题解决
    误删除/var/lib/dpkg解决办法
    Microsoft Office CVE-2017-8570
    mariadb ==> 开机自启动
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5434866.html
Copyright © 2011-2022 走看看