代码改变世界

ios - GCD简单小结

2016-04-26 14:04  菜鸟Alex  阅读(293)  评论(0编辑  收藏  举报

首先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;
    });
}