关于同步和异步的一些总结(dispatch)

来源:互联网 发布:云计算谁提出的 编辑:程序博客网 时间:2024/04/26 21:38


dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);        dispatch_async(queue1, ^{            NSLog(@"第一次读图片1");            dispatch_async(dispatch_get_main_queue(), ^{                NSLog(@"更新图片");            });        });



由于很多情况下下载要很长时间,所以为了有更好的用户体验就需要进行异步操作

这样就可以模仿上述的方式进行书写

由于更新图片需要在主线程里面运行

所以在新的线程里面获得了image之后需要回到main_queue进行更新


话说在同样一个线程里面运行两条语句的时候是随机运行的


用另一个例子可能更加明白

dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);        dispatch_async(queue3, ^{            NSLog(@"第一次读图片3");        });        dispatch_async(queue3, ^{            NSLog(@"第二次读图片3");        });        dispatch_async(queue3, ^{            NSLog(@"第三次读图片3");        });        dispatch_async(queue3, ^{            NSLog(@"第四次读图片3");        });

结果是:

2013-04-19 19:18:47.352 demoForAsync[575:12303] 第一次读图片3

2013-04-19 19:18:47.356 demoForAsync[575:13203] 第四次读图片3

2013-04-19 19:18:47.353 demoForAsync[575:12403] 第二次读图片3

2013-04-19 19:18:47.355 demoForAsync[575:12f03] 第三次读图片3


很明显是没有规律的


        dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);        dispatch_async(queue1, ^{            NSLog(@"第一次读图片1");            dispatch_async(dispatch_get_main_queue(), ^{                NSLog(@"更新图片");            });        });                dispatch_async(queue1, ^{            NSLog(@"第二次读图片1");        });

然后可以看一下文档

关于dispatch_get_global_queue

第一个参数有四种


是不是很熟悉

貌似mfc里面有很多这样的东西

优先级越高获得资源就越多(大神教导我说可以看下操作系统,以后再看吧。。。)

dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);        dispatch_async(queue1, ^{            NSLog(@"第一次读图片1");            dispatch_async(dispatch_get_main_queue(), ^{                NSLog(@"更新图片");            });        });                dispatch_async(queue1, ^{            NSLog(@"第二次读图片1");        });                dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);        dispatch_async(queue2, ^{            NSLog(@"第一次读图片2");            dispatch_async(dispatch_get_main_queue(), ^{                NSLog(@"更新图片");            });        });                dispatch_async(queue2, ^{            NSLog(@"第二次读图片2");        });

看这个,猜下会怎样

这个是结果啦

2013-04-19 19:08:08.159 demoForAsync[442:12503] 第二次读图片2

2013-04-19 19:08:08.158 demoForAsync[442:12403] 第一次读图片2

2013-04-19 19:08:08.160 demoForAsync[442:12c03] 第二次读图片1

2013-04-19 19:08:08.159 demoForAsync[442:12303] 第一次读图片1

2013-04-19 19:08:08.232 demoForAsync[442:11303] 更新图片

2013-04-19 19:08:08.237 demoForAsync[442:11303] 更新图片


不过如果再运行一次,有可能发现前四个顺序不一样

2013-04-19 19:09:27.671 demoForAsync[455:12403] 第一次读图片2

2013-04-19 19:09:27.672 demoForAsync[455:12503] 第二次读图片2

2013-04-19 19:09:27.672 demoForAsync[455:12303] 第一次读图片1

2013-04-19 19:09:27.674 demoForAsync[455:12c03] 第二次读图片1

2013-04-19 19:09:27.742 demoForAsync[455:11303] 更新图片

2013-04-19 19:09:27.745 demoForAsync[455:11303] 更新图片



其实可以将两个进程同时计算i++

看同一时间的时候两个所到达的那个数字的大小就可以知道两者所获得资源的大小

如下

dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);        dispatch_queue_t queue5 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);        __block int i = 0;        __block int j = 0;        dispatch_async(queue4, ^{            for (; i < 1000; i++)                NSLog(@"i=%d", i);        });        dispatch_async(queue5, ^{            for (; j < 1000; j++)                NSLog(@"j=%d", j);        });
就不贴结果了,结果是高优先的先做完的

给个demo,不想打可以看一下

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换奶粉不拉屎了怎么办 婴儿吃奶粉不拉屎怎么办 1岁半突然不喝奶怎么办 6个月宝宝不吃奶粉怎么办 7个月宝宝不吃奶粉怎么办 5个月宝宝不吃奶粉怎么办 一岁两个月宝宝不长肉怎么办 7个月宝宝肚子疼怎么办 奶喝一半凉了怎么办 5个月孩子厌奶怎么办 怀孕后特别不爱吃水果怎么办 宝宝吃了无比滴怎么办 婴儿上火怎么办吃什么可以去火 肚子胀怎么办最快的方法 40天婴儿拉水怎么办 8个月宝宝坐不稳怎么办 宝宝段奶不吃奶粉怎么办 3个月宝宝头睡偏了怎么办 2个月婴儿抱着睡怎么办 两个半月的宝宝睡眠少怎么办 七个月宝宝不愿意坐怎么办 一个多月的宝宝老是哭闹怎么办 宝宝头老往后仰怎么办 8个月宝宝不会爬怎么办 孩子个头长得慢怎么办 宝宝个头长得慢怎么办 婴儿个头长得慢怎么办 11个月宝宝认生怎么办 3个月宝宝认人怎么办 3个月的宝宝认生怎么办 两个月的宝宝睡觉一惊一惊怎么办 六个月宝宝不喜欢喝水怎么办 三岁宝宝尿多怎么办 一岁的宝宝尿少怎么办 一岁宝宝尿黄怎么办 三岁宝宝尿黄怎么办 5个月宝宝认生怎么办 3岁宝宝怕生胆小怎么办 2岁宝宝怕生胆小怎么办 1岁半宝宝认生怎么办 宝宝认人一直哭怎么办