1、GCD 全称 Grand Central Dispatch
2、功能:
一、调度队列:所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同。GCD自动的为我们提供了一些调度队列,我们也可以创建新的用于具体的目的。
二、调度资源:它是一个监视某些类型事件的对象。当这些事件发生时,它自动将一个block放入一个调度队列的执行例程中。
三、调度组:允许将多任务分组来方便后来加入执行。任务能作为一个组中的一个成员被加到队列中,客户端能用这个组对象来等待直到这个组中的所有任务完成。
四、调度信号量 :允许客户端并行发布一定数量的任务。
3、代码:
dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);
dispatch_async(myQueue, ^{ [self doSomething]; });
其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{
[self doSomething]; }
);
<span style="font-family: arial, 宋体, sans-serif; font-size: 1em; text-indent: 2em; background-color: rgb(255, 255, 255);">如果需要暂停一个队列,可以调用如下代码。暂停一个队列会阻止和该队列相关的所有代码运行。</span>
dispatch_suspend(myQueue);//暂停一个队列
dispatch_resume(myQueue);//恢复一个队列
dispatch_sync(dispatch_get_main_queue(), ^{
[self dismissLoginWindow]; }
);
//注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用。
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- [self goDoSomethingLongAndInvolved];
- dispatch_async(dispatch_get_main_queue(), ^{
- [textField setStringValue:@"Done doing something long and involved"];
- });
- });
- __block NSString *stringValue;
- dispatch_sync(dispatch_get_main_queue(), ^{
- // __block variables aren't automatically retained
- // so we'd better make sure we have a reference we can keep
- stringValue = [[textField stringValue] copy];
- });
- [stringValue autorelease];
- // use stringValue in the background now
我们还可以使用更好的方法来完成这件事——使用更“异步”的风格。不同于取界面层的值时要阻塞后台线程,你可以使用嵌套的block来中止后台线程,然后从主线程中获取值,然后再将后期处理提交至后台线程:
- dispatch_queue_t bgQueue = myQueue;
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString *stringValue = [[[textField stringValue] copy] autorelease];
- dispatch_async(bgQueue, ^{
- // use stringValue in the background now
- });
- });
取决于你的需求,myQueue可以是用户队列也可以使全局队列。
不再使用锁(Lock)
用户队列可以用于替代锁来完成同步机制。在传统多线程编程中,你可能有一个对象要被多个线程使用,你需要一个锁来保护这个对象:
- NSLock *lock;
访问代码会像这样:
- - (id)something
- {
- id localSomething;
- [lock lock];
- localSomething = [[something retain] autorelease];
- [lock unlock];
- return localSomething;
- }
- - (void)setSomething:(id)newSomething
- {
- [lock lock];
- if(newSomething != something)
- {
- [something release];
- something = [newSomething retain];
- [self updateSomethingCaches];
- }
- [lock unlock];
- }
使用GCD,可以使用queue来替代:
- dispatch_queue_t queue;
要用于同步机制,queue必须是一个用户队列,而非全局队列,所以使用usingdispatch_queue_create初始化一个。然后可以用dispatch_async 或者 dispatch_sync将共享数据的访问代码封装起来:
- - (id)something
- {
- __block id localSomething;
- dispatch_sync(queue, ^{
- localSomething = [something retain];
- });
- return [localSomething autorelease];
- }
- - (void)setSomething:(id)newSomething
- {
- dispatch_async(queue, ^{
- if(newSomething != something)
- {
- [something release];
- something = [newSomething retain];
- [self updateSomethingCaches];
- }
- });
- }