1. GCD 使用后不用程序去管理线程的开闭,GCD会在系统层面上去动态检测系统状态,开闭线程
2. Dispatch Queues 串行 并行 2种 FIFO 把task依次放入串行queue可以实现顺序执行
3. Operation Queues 可以指定任务之间的优先级 task之间的先后依赖关系 4. __block变量是可以改变的 共享的,保持一致的
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); // 并行queue
for (__block int i = 0; i<10000; i++) { dispatch_async(aQueue, ^{ NSLog(@"%d",i); }); }
2011-07-05 17:11:38.346 ttt[41418:1803] 61 2011-07-05 17:11:38.346 ttt[41418:5f03] 1292 2011-07-05 17:11:38.348 ttt[41418:1803] 4096 2011-07-05 17:11:38.348 ttt[41418:5f03] 4954 2011-07-05 17:11:38.349 ttt[41418:1803] 5823 2011-07-05 17:11:38.349 ttt[41418:5f03] 6159 2011-07-05 17:11:38.349 ttt[41418:1803] 6575 2011-07-05 17:11:38.349 ttt[41418:5f03] 6634 2011-07-05 17:11:38.350 ttt[41418:1803] 7936 2011-07-05 17:11:38.350 ttt[41418:5f03] 8428 2011-07-05 17:11:38.351 ttt[41418:1803] 8895 2011-07-05 17:11:38.351 ttt[41418:5f03] 9364 2011-07-05 17:11:38.351 ttt[41418:1803] 9836 2011-07-05 17:11:38.351 ttt[41418:5f03] 10000 2011-07-05 17:11:38.354 ttt[41418:1803] 10000
5. 一般外部变量是copy正在运行时的外部状态
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i<1000; i++) { dispatch_async(aQueue, ^{ NSLog(@"%d",i); }); }
2011-07-05 17:15:37.525 ttt[41697:1803] 0 2011-07-05 17:15:37.526 ttt[41697:1803] 2 2011-07-05 17:15:37.527 ttt[41697:1803] 3 2011-07-05 17:15:37.527 ttt[41697:1803] 4 2011-07-05 17:15:37.527 ttt[41697:1803] 5 2011-07-05 17:15:37.527 ttt[41697:1803] 6 2011-07-05 17:15:37.526 ttt[41697:5f03] 1 2011-07-05 17:15:37.530 ttt[41697:5f03] 8 2011-07-05 17:15:37.530 ttt[41697:5f03] 9 2011-07-05 17:15:37.530 ttt[41697:5f03] 10 2011-07-05 17:15:37.530 ttt[41697:5f03] 11 2011-07-05 17:15:37.532 ttt[41697:6203] 13
6. queue可以有结束时执行的方法
void myFinalizerFunction(){ NSLog(@"xxx"); }
- (void)viewDidLoad { [superviewDidLoad]; dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); // 串行queue dispatch_set_context(queue, @"xxx"); dispatch_set_finalizer_f(queue, &myFinalizerFunction); for (int i = 0; i<1000; i++) { dispatch_async(queue, ^{ NSLog(@"%d",i); }); } dispatch_release(queue);
7. dispatch_sync(queue,task) 会阻塞当前线程, 直到queue完成了你给的task,但queue要完成你给的task,因为queue是FIFO的,意味着要完成之前的任务,才有机会执行你刚才给的task, 相当于当前线程等待queue里面所有任务执行完毕,所以这句话不能在当前queue的任务代码里面调用,会造成阻塞
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); // 串行queue dispatch_set_context(queue, @"xxx"); dispatch_set_finalizer_f(queue, &myFinalizerFunction); for (int i = 0; i<10; i++) { dispatch_async(queue, ^{ NSLog(@"%d",i); }); } NSLog(@"waiting"); dispatch_sync(queue, ^{ NSLog(@"wait done"); }); dispatch_release(queue);
2011-07-05 17:54:35.479 ttt[44203:207] waiting 2011-07-05 17:54:35.479 ttt[44203:1803] 0 2011-07-05 17:54:35.481 ttt[44203:1803] 1 2011-07-05 17:54:35.482 ttt[44203:1803] 2 2011-07-05 17:54:35.482 ttt[44203:1803] 3 2011-07-05 17:54:35.483 ttt[44203:1803] 4 2011-07-05 17:54:35.483 ttt[44203:1803] 5 2011-07-05 17:54:35.484 ttt[44203:1803] 6 2011-07-05 17:54:35.484 ttt[44203:1803] 7 2011-07-05 17:54:35.485 ttt[44203:1803] 8 2011-07-05 17:54:35.485 ttt[44203:1803] 9 2011-07-05 17:54:35.486 ttt[44203:207] wait done 2011-07-05 17:54:35.487 ttt[44203:1803] xxx
8. Waiting on Groups of Queued Tasks // dispatch_sync只能对一个queue等待
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); // Add a task to the group dispatch_group_async(group, queue, ^{ NSLog(@"first task"); }); dispatch_queue_t otherqueue = dispatch_queue_create("com.example.MyQueue", NULL); for (int i = 0; i<100; i++) { dispatch_group_async(group, otherqueue, ^{ NSLog(@"otherqueue task"); }); }
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end waiting");
dispatch_release(group);
2011-07-05 19:32:31.919 ttt[50138:5f03] otherqueue task 2011-07-05 19:32:31.919 ttt[50138:1803] first task 2011-07-05 19:32:31.922 ttt[50138:5f03] otherqueue task 2011-07-05 19:32:31.923 ttt[50138:5f03] otherqueue task ... 2011-07-05 19:32:32.078 ttt[50138:5f03] otherqueue task 2011-07-05 19:32:32.079 ttt[50138:5f03] otherqueue task 2011-07-05 19:32:32.080 ttt[50138:207] end waiting
9. Although you can obtain information about the underlying thread running a task, it is better to avoid doing so
|
转载于:https://my.oschina.net/dake/blog/196623