GCD:一个代替NSThread等线程的技术。可以处理数据锁定和资源泄露登异步编程问题。
GCD原理:让一个程序,根据可用的处理资源,平行排队执行一个任务。
GCD中的一个任务可以被放置于一个适当的队列中。这样比一个个执行任务的方式更有效率。
GCD队列:
只要给GCD提供执行代码块, 用于在 系统或用户 创建的队列上调度运行。
1声明一个用户队列:
dispatch_queue_tmyQueue = dispatch_queue_create(“myQueue_flag”,NULL);
2执行一个 异步执行 列队:
dispatch_async(myQueue,^{[self dosomething];})
3声明并执行:
dispatch_async(dispatch_queue_create(“myQueue_flag”,NULL),^{[self dosomething];})
4暂停一个列队:
dispatch_suspend(myQueue);
5主线程上运行代码:
dispatch_sync(dispatch_get_main_queue(),^{ [self doSometinginMainWindow] });
ps:dispatch_get_global_queue(0, 0);获得程序是并发的。有优先级高中低,三个队列。并且三个队列不代表三个线程,可能会有很多线程。
Dispatch_get_main_queue();主线程的队列,是一个串行队列。
6
一dispatch_async(queue,^{
//block 代码
})//异步执行代码
可以用异步来执行后台程序
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//子线程中开始网络请求数据
//更新数据模型
dispatch_sync(dispatch_get_main_queue(), ^{
//在主线程中更新UI代码
});
});
二 dispatch_sync(
queue, ^{
//block 代码
})//同步执行代码
可以用同步来实现简单死锁
-(void)writeDB:(NSData *)data
{
dispatch_sync(queue1, ^{
//dosomething
});
}
我的理解是 把多次调用dosomething放到一个队列中,下次调用时必须要等上次调用完成后才能进行,所以线程是安全的。
7 dispatch_apply(count,queue, ^{
//dosomething
})
count是个迭代器,而且多个block执行时是否并发或者串行依赖于queue的队列是否是并发或者串行的。