精华内容
参与话题
问答
  • dispatch

    2015-09-29 14:12:50
    1、dispatch_group_async的使用 dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。...

    1、dispatch_group_async的使用

    dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:

     

    1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
    2. dispatch_group_t group = dispatch_group_create();  
    3. dispatch_group_async(group, queue, ^{  
    4.     [NSThread sleepForTimeInterval:1];  
    5.     NSLog(@"group1");  
    6. });  
    7. dispatch_group_async(group, queue, ^{  
    8.     [NSThread sleepForTimeInterval:2];  
    9.     NSLog(@"group2");  
    10. });  
    11. dispatch_group_async(group, queue, ^{  
    12.     [NSThread sleepForTimeInterval:3];  
    13.     NSLog(@"group3");  
    14. });  
    15. dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
    16.     NSLog(@"updateUi");  
    17. });  
    18. dispatch_release(group);  
    dispatch_group_async是异步的方法,运行后可以看到打印结果:

     

    2012-09-25 16:04:16.737 gcdTest[43328:11303] group1
    2012-09-25 16:04:17.738 gcdTest[43328:12a1b] group2
    2012-09-25 16:04:18.738 gcdTest[43328:13003] group3
    2012-09-25 16:04:18.739 gcdTest[43328:f803] updateUi

    每个一秒打印一个,当第三个任务执行后,upadteUi被打印。

     

    2、dispatch_barrier_async的使用

    dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

    例子代码如下:

     

    1. dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);  
    2. dispatch_async(queue, ^{  
    3.     [NSThread sleepForTimeInterval:2];  
    4.     NSLog(@"dispatch_async1");  
    5. });  
    6. dispatch_async(queue, ^{  
    7.     [NSThread sleepForTimeInterval:4];  
    8.     NSLog(@"dispatch_async2");  
    9. });  
    10. dispatch_barrier_async(queue, ^{  
    11.     NSLog(@"dispatch_barrier_async");  
    12.     [NSThread sleepForTimeInterval:4];  
    13.   
    14. });  
    15. dispatch_async(queue, ^{  
    16.     [NSThread sleepForTimeInterval:1];  
    17.     NSLog(@"dispatch_async3");  
    18. });  

    打印结果:

     

    2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async1

    2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async2

    2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async

    2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3

    请注意执行的时间,可以看到执行的顺序如上所述。

    3、dispatch_apply 

    执行某个代码片段N次。
    dispatch_apply(5, globalQ, ^(size_t index) {
        // 执行5次

    }); 

    展开全文
  • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ }); 并行队列 + 同步 = 同步 ...

    从字面意思上看,sync 同步,async 异步。

    • 并行队列 + 异步 = 异步
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
        });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
        });
    
    • 并行队列 + 同步 = 同步
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
        });
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
        });
    

    顺序执行

    • 串行队列 + 同步
    dispatch_sync(dispatch_get_main_queue(), ^{
    
    });
    

    主线程是一个同步队列,里面加一个同步任务,线程锁死。老一些的iOS版本直接会闪退,新一些的版本block中的代码块将不会被执行,但未闪退。总之这样做是有问题的。需要判断处理:

    if ([[NSThread currentThread] isMainThread])
    {
        // ...
    }
    else {
        dispatch_async(dispatch_get_main_queue(), ^{
            // ...
        });
    }
    

    为了线程安全,做这样处理。

    展开全文
  • 在使用flux进行数据交互的时候,出现了一个问题Flux Dispatch.dispatch(…): Cannot dispatch in the middle of a dispatch,在国内竟然没有找到解决方案,最后在https://stackoverflow.com上找到了解决方案,但是...

    在使用flux进行数据交互的时候,出现了一个问题Flux Dispatch.dispatch(…): Cannot dispatch in the middle of a dispatch,在国内竟然没有找到解决方案,最后在https://stackoverflow.com上找到了解决方案,但是原理不清楚【这不是我的风格,空下来一定搞懂】。

    解决方案:

    老外是这么说的:
    You can make it work by “scheduling” the next action instead of calling it directly, here is an example code:
    译:你可以在指定的时间调度一个action而不是直接调用它。

    // instead of doing this
    Dispatcher.dispatch(...);
    
    // go like this
    setTimeout(function() {
      Dispatcher.dispatch(...);
    }, 1);

    我的解决方案:

    setTimeout(function () {
          Actions.synchronizePanekeyToStore(currenPaneKey);
        }, 1);

    这样就可以了,真心感觉老外很热心。

    展开全文
  • springBoot项目遇到了“Handler dispatch failed; nested exception is java.lang.StackOverflowError”的错误。总结一哈:StackOverflowError通常情况下是死循环或者是循环依赖了。Caused by: java.lang....

    欢迎大家关注我的公众号,添加我为好友!

    springBoot项目遇到了“Handler dispatch failed; nested exception is java.lang.StackOverflowError”的错误。

    总结一哈:

    StackOverflowError通常情况下是死循环或者是循环依赖了。

    Caused by: java.lang.StackOverflowError
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)
    	at com.hry.seckill.service.impl.GoodsServiceImpl.getGoodsVoList(GoodsServiceImpl.java:17)

     

    然后检查定位到的位置,发现错误:

     

     

    @Service
    public class GoodsServiceImpl implements GoodsService {
        @Autowired
        private GoodsService goodsService;

    我在Service中没有正确引用编写的Mapper而是引用了Service,所以报错,改正即可。

     

    @Service
    public class GoodsServiceImpl implements GoodsService {
        @Autowired
        private GoodsMapper goodsMapper;

    最后重启项目即可。

    欢迎大家关注我的公众号,添加我为好友!

    展开全文
  • Dispatch Group

    2018-04-06 16:57:45
    //在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理时: //a.只使用一个Serial Dispatch Queue时,只要将想执行的处理全部追加到该 Serial Dispatch Queue中并在最后追加结束处理,即可实现。 //b.使用...
  • Dispatch Queues

    2017-10-02 21:58:34
    Grand Central Dispatch (GCD) dispatch queues是一个执行多任务的强大工具。Dispatch queues让你执行任意blocks的代码,无论它是同步或异步。你可以使用dispatch queues在分开的线程上执行几乎所有的任务。dispatch...
  • dispatch_async和dispatch_sync。一个是异步不等待任务完成就返回,另一个是同步任务,需要等待任务完成。这两种提交任务的方式有所不同: dispatch_async :底层运用了线程池,会在和当前线程不同的线程上处理...
  • dispatch_walltime的官方文档解释如下 Function dispatch_walltime // 根据系统时钟,创建一个绝对时间 Creates a dispatch_time_t using an absolute time according to the wall clock. Declaration dispatch_time_...
  • dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单。要很好地理解dispatch源,其实把它看成一种特别的生产消费模式。dispatch源好比生产的数据,当有新数据时,会自动在dispatch...
  • GCD Dispatch Sourceshttps://www.cnblogs.com/hlwfirst/p/5492493.htmlGCD dispatch_read 与 dispatch_write 文件读写http://blog.sina.com.cn/s/blog_6d01cce30101hzws.htmlGCD Dispatch I/Ohttps://blog.csdn...
  • dispatch_sync 线程同步、dispatch_async线程异步 比如 //同步 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"dispatch_sync - 1"); }); dispa...
  • dispatch source

    2016-08-01 18:28:17
    dispatch source 的作用是负责监听事件,先看看它的构造函数。 [objc] view plaincopy在CODE上查看代码片派生到我的代码片dispatch_source_create(dispatch_source_type_t type, uintptr_t handle, unsigned ...
  • dispatch_sync(dispatch_get_main_queue(), ^(){ NSLog(@”222”); }); 在iOS中是无法使用 dispatch_sync(dispatch_get_main_queue() 原因如下: 在ios使用 dispatch_sync(dispatch_get_main_queue()^(){...
  •  * dispatch_after 从现在开始经过多少纳秒之后,由队列调度任务  * when 从现在开始经过多少纳秒之后  * queue dispatch_get_main_queue(),  * block "异步"任务  */  dispatch_time_t when = dispatch_...
  • Dispatch Sources

    2018-05-08 11:24:49
    在你需要与底层系统交互时,就要做好该交互任务会持续一段时间的准备了。无论是内核抑或是其他系统层级...GCD通过提供blocks 和 dispatch queues来使个人可以提交请求并取得结果报告。 关于Dispatch Sources Di...
  • Main Dispatch Queue和Global Dispatch Queue Main Dispatch: 是在主线程中执行的派发队列,因为主线程只有1个,所以MainDispatch Queue 是 Serial Dispatch Queue。 追加到Main Dispatch Queue的处理在主线程的...
  • dispatch记录

    2015-02-28 12:55:42
    1,dispatch_set_target_queue dispatch_queue_t serialQueue = dispatch_queue_create("com.example", NULL);... dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND
  • Dispatch简介

    2014-10-22 15:02:00
    Dispatch Objects 尽管GCD是纯C语言的,但它被组建成面向对象的风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象一样是引用计数的。最新版本的XCode已经将dispatch objects加入到了ARC大家庭。 ...
  • Dispatch Semaphore

    2015-02-26 10:44:13
    如果提交到 dispatch queue 中得任务需要访问某些有限资源,可以使用dispatch semaphore 来控制同时访问这个资源的任务数量。 dispatch semaphore 和普通的信号量类似,唯一的区别是当资源可用时,需要更少的时间来...
  • 第一、dispatch_apply 是同步函数,会阻塞当前线程直到所有循环迭代执行完成。当提交到并发queue时,循环迭代的执行顺序是不确定的 示例:  dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_...
  • dispatch_suspend 与 dispatch_resume探索

    千次阅读 2017-06-14 19:14:10
    首先探索dispatch_suspend 适用范围截取官方文档一句话 The dispatch queue or dispatch source to suspend. (You cannot suspend other types of dispatch objects.) This parameter cannot be NULL. 意思就是...
  • 1、dispatch_barrier_asyncdispatch_barrier_async用于等待前面的任务执行完毕后自己才执行,而它后面的任务需等待它完成之后才执行。一个典型的例子就是数据的读写,通常为了防止文件读写导致冲突,我们会创建一个...
  • dispatch基础

    2015-06-15 17:32:56
    GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用。所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得...
  • dispatch_source

    2019-09-20 04:30:41
    dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单。要很好地理解dispatch源,其实把它看成一种特别的生产消费模式。 dispatch源好比生产的数据,当有新数据时,会自动在dispatch...
  • dispatch同步

    千次阅读 2014-08-25 22:32:55
    [objc] view plaincopy 原文地址 ...GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。  一、dispatch组(dispatch group)    1. 创建dispatch组    disp
  • 本文阅读的过程中,如有概念不懂,请参照前一篇文章,如果还有疑惑,请留言。 这是我关于GCD专栏的地址 ...本教涵盖的内容 一、dispatch_after 二、dispatch_apply 三、dispatch_once

空空如也

1 2 3 4 5 ... 20
收藏数 48,153
精华内容 19,261
关键字:

dispatch