GCD 队列 线程
<pre name="code" class="objc">//串行方法 全为同步 - (void)serial:(UIButton *)but { NSLog(@"串行开始"); // 2种方法获得串行队列 // 一是 获取mainQueue,mainQueue是程序自带的一个serialQueue,此queue的所有task在主线程执行。缺点容易卡死主线程 // dispatch_queue_t queue = dispatch_get_main_queue();//获取主线程队列 //二是自己创建serialQueue 自己创建的serialQueue会在子线程执行task //GCD 可以非常简单切换线程 //串行队列无并发 所有方法都是同步执行 执行优先级为: 普通 > 同步 > 异步 dispatch_queue_t queue = dispatch_queue_create("com.lanou.myserialQueue", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{ NSLog(@"hello world1 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_sync(queue, ^{ NSLog(@"hello world2 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_sync(queue, ^{ NSLog(@"hello world3 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); NSLog(@"串行结束"); }
2015-12-28 11:22:06.874 5-12LessonGCD[6502:103060] 串行开始 2015-12-28 11:22:06.876 5-12LessonGCD[6502:103060] hello world1 <NSThread: 0x7fd983d04910>{number = 1, name = main}--->1 2015-12-28 11:22:06.876 5-12LessonGCD[6502:103060] hello world2 <NSThread: 0x7fd983d04910>{number = 1, name = main}--->1 2015-12-28 11:22:06.876 5-12LessonGCD[6502:103060] hello world3 <NSThread: 0x7fd983d04910>{number = 1, name = main}--->1 2015-12-28 11:22:06.876 5-12LessonGCD[6502:103060] 串行结束
<pre name="code" class="objc">//串行方法 全为异步 - (void)serial:(UIButton *)but { NSLog(@"串行开始"); // 2种方法获得串行队列 // 一是 获取mainQueue,mainQueue是程序自带的一个serialQueue,此queue的所有task在主线程执行。缺点容易卡死主线程 // dispatch_queue_t queue = dispatch_get_main_queue();//获取主线程队列 //二是自己创建serialQueue 自己创建的serialQueue会在子线程执行task //GCD 可以非常简单切换线程 //串行队列无并发 所有方法都是同步执行 执行优先级为: 普通 > 同步 > 异步 dispatch_queue_t queue = dispatch_queue_create("com.lanou.myserialQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ NSLog(@"hello world1 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_async(queue, ^{ NSLog(@"hello world2 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_async(queue, ^{ NSLog(@"hello world3 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); NSLog(@"串行结束"); }
2015-12-28 10:58:14.371 5-12LessonGCD[5020:79140] 串行开始2015-12-28 10:58:14.371 5-12LessonGCD[5020:79140] 串行结束2015-12-28 10:58:14.372 5-12LessonGCD[5020:79180] hello world1 <NSThread: 0x7fa76061afd0>{number = 3, name = (null)}--->02015-12-28 10:58:14.373 5-12LessonGCD[5020:79180] hello world2 <NSThread: 0x7fa76061afd0>{number = 3, name = (null)}--->02015-12-28 10:58:14.373 5-12LessonGCD[5020:79180] hello world3 <NSThread: 0x7fa76061afd0>{number = 3, name = (null)}--->0
//串行方法 情况3 同步 异步皆有 - (void)serial:(UIButton *)but { NSLog(@"串行开始"); // 2种方法获得串行队列 // 一是 获取mainQueue,mainQueue是程序自带的一个serialQueue,此queue的所有task在主线程执行。缺点容易卡死主线程 // dispatch_queue_t queue = dispatch_get_main_queue();//获取主线程队列 //二是自己创建serialQueue 自己创建的serialQueue会在子线程执行task //GCD 可以非常简单切换线程 //串行队列无并发 所有方法都是同步执行 dispatch_queue_t queue = dispatch_queue_create("com.lanou.myserialQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ NSLog(@"hello world1 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_sync(queue, ^{ NSLog(@"hello world2 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); dispatch_async(queue, ^{ NSLog(@"hello world3 %@--->%d",[NSThread currentThread], [NSThread isMainThread]); }); NSLog(@"串行结束"); }<pre name="code" class="objc">2015-12-28 11:12:16.597 5-12LessonGCD[5956:93193] 串行开始 2015-12-28 11:12:16.599 5-12LessonGCD[5956:93235] hello world1 <NSThread: 0x7f8b80e06cd0>{number = 2, name = (null)}--->0 2015-12-28 11:12:16.599 5-12LessonGCD[5956:93193] hello world2 <NSThread: 0x7f8b80c02520>{number = 1, name = main}--->1 2015-12-28 11:12:16.599 5-12LessonGCD[5956:93193] 串行结束 2015-12-28 11:12:16.599 5-12LessonGCD[5956:93235] hello world3 <NSThread: 0x7f8b80e06cd0>{number = 2, name = (null)}--->0
</pre><br /><pre name="code" class="objc">// 后台执行: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // something }); // 主线程执行: dispatch_async(dispatch_get_main_queue(), ^{ // something }); // 一次性执行: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once }); // 延迟2秒执行: double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // code to be executed on the main queue after delay }); // 自定义dispatch_queue_t dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL); dispatch_async(urls_queue, ^{ // your code }); dispatch_release(urls_queue); // 合并汇总结果 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程一 }); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程二 }); dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{ // 汇总结果 });