美文网首页
异步 并行

异步 并行

作者: 择一城终老_蜗牛 | 来源:发表于2018-08-09 15:59 被阅读0次
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
// 处理耗时操作的代码块... 

//通知主线程刷新 
dispatch_async(dispatch_get_main_queue(), ^{ 
//回调或者说是通知主线程刷新, 
}); 

});

dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。
dispatch_get_global_queue(0, 0),指用了全局队列。
一般来说系统本身会有3个队列。
global_queue,current_queue,以及main_queue.
获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低

#define DISPATCH_QUEUE_PRIORITY_HIGH     2  
#define DISPATCH_QUEUE_PRIORITY_DEFAULT  0  
#define DISPATCH_QUEUE_PRIORITY_LOW     (-2) 

处理完事物后,需要将结果返回给或者是刷新UI主线程,同样,和上面一样,抓取主线程,程序块操作。

eg:用例子来加深理解

1.同步(伪同步)

for (int i = 0 ; i < 10; i++) {       
      UIImage *img = [self getImgeWith:[urlArr objectForIndex:i]];  
       [myImgV[i] setImage:img];  
}

假设我要加载10个图片,我现在拥有这些图片的资源地址,保存在一个数组中。
我们先以获取第一张图片来举例:
同步执行的概念就是,我获取完第一张图片的,
执行了for循环第一句返回了img后,我才能执行第二句,UI界面的刷新。
如果第一句返回的时间需要10秒,那我程序的响应就仿佛一直卡在这里一样,我无法进行其他操作。必须等它返回!!
因此,同步的一个很好理解的感念就是,一步走到黑。

2.异步

for (int i = 0 ; i < 10; i++) {  
      dispatch_async(dispatch_get_global_queue(0, 0), ^{  
      // 处理耗时操作的代码块...  
       UIImage *img = [self getImgeWith:[urlArr objectForIndex:i]];  
      //通知主线程刷新  
      dispatch_async(dispatch_get_main_queue(), ^{  
          //回调或者说是通知主线程刷新,  
            [myImgV[i] setImage:img];  
      });  
        
  });

看了这代码,我们会说,异步操作那个假设还是要10秒啊,总体看来,执行一张图片的时间加载还是要在10秒左右啊,
貌似异步没什么鸟用么。但是,别忽略了其中一点,也是核心的一点,此时我们图片获取操作放在里一个线程队列里,
此刻,虽然我们看着图片的加载还是需要10秒才会出来,但是,在这10秒期间,我们的UI主线程是可以操作的,比如界面上有个按钮,你是可以按的
而不是如上面的同步,在10面期间,我是只能干等着,什么都做不了。
异步的核心概念就是一个新线程,一个消息回调通知。

3.并行

简单阐述下异步和并发关系。
其实看了上面说的,异步只是提供了一种多线程处理的概念,
并发是更像是异步的一种大规模实现。
就好比说,异步提出了可以用小弟去收保护费,收完了告诉并交给自己,而我在期间做其他要做的事。
并发突然想到,异步这个很有道理啊,那我有4个地方要收,一个小弟去收,虽然我还是可以闲着做其他的事,
但是小弟跑四个地方,我拿到钱所需要的时间还是和我自己去收一样的,只不过我不用那么费劲了,还能做其他事了。
因此,并发觉得应该派四个小弟去,因为每个场地的保护费各不相干的。

因此说,异步解决了线程堵塞,而并发则是在异步的基础上,提高了符合特性事件的处理时间效率。

相关文章

  • iOS多线程小结

    同步异步串行并行 同步串行:不开启线程 同步并行:不开启线程 异步串行:最多开启一个线程 异步并行:开启线程 同步...

  • 多线程GCD的使用

    一、同步/异步、串行/并行的区别 1.同步/异步 同步/异步是指线程与线程之间的关系。 2.串行/并行 串行、并行...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • GCD 相关函数

    串行同步 串行异步 并行同步 并行异步 主队列同步 会死锁 主队列异步 异步处理耗时,回主线程刷新UI 栅栏函数 ...

  • 2017-10-19-同步和异步

    同步和异步 1,同步 2,异步 并发和并行都是异步任务实现的俩种方式 3,并发 4,并行 总结:并行是相对于多核C...

  • 异步 并行

    dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块...

  • sync 和 async区别

    同步,异步,串行,并行

  • GCD

    同步、异步、串行、并行的概念 同步/异步:指的是能否开启新的线程,同步不能开启新的线程,异步可以。串行/并行:指的...

  • GCD 小结

    一、 同步/异步、串行/并行的区别 1.同步/异步 同步/异步是指线程与线程之间的关系. 2.串行/并行 串行/并...

  • 进程和线程的区别 同步异步的区别 并行和并发的区别

    线程 进程 同步 异步 并行 并发

网友评论

      本文标题:异步 并行

      本文链接:https://www.haomeiwen.com/subject/jfhgvftx.html