您的位置:首页 > 移动开发 > IOS开发

ios - GCD简单小结

2016-04-26 14:04 239 查看

首先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;
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: