GCD--同步执行

作者: HarriesChen | 来源:发表于2015-05-18 01:38 被阅读528次

在实际开发中,我们需要按顺序执行一些异步的任务,我们应该怎么做呢?

答案是:dispatch_group_notify

这里我们使用手动管理block的运行状态

dispatch_group_enter相当于提交了一个任务

dispatch_group_leave相当于完成了一个任务

这里需要强调一点

进入和退出group次数必须匹配 如果少了leave话notify是永远都完成不了的

实例代码如下:

dispatch_group_t serviceGroup = dispatch_group_create();

// Start the first task
dispatch_group_enter(serviceGroup);

[self startTask:5  Block:^(BOOL success) {
    dispatch_group_leave(serviceGroup);
}];

// Start the second task
dispatch_group_enter(serviceGroup);

[self startTask:5 Block:^(BOOL success) {
    dispatch_group_leave(serviceGroup);
}];

dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{
        NSLog(@"finish");
});

NSLog(@"next");
  • (void)startTask:(NSInteger)time Block:(someBlock)block
    {
    for (NSInteger i=0; i<time; i++) {

      NSLog(@"%ld",i);
    

    }
    block(YES);
    }
    输出结果:

2015-05-16 14:46:31.401 syncTest[26054:9467066] 0
2015-05-16 14:46:31.401 syncTest[26054:9467066] 1
2015-05-16 14:46:31.402 syncTest[26054:9467066] 2
2015-05-16 14:46:31.402 syncTest[26054:9467066] 3
2015-05-16 14:46:31.402 syncTest[26054:9467066] 4
2015-05-16 14:46:31.402 syncTest[26054:9467066] 0
2015-05-16 14:46:31.402 syncTest[26054:9467066] 1
2015-05-16 14:46:31.402 syncTest[26054:9467066] 2
2015-05-16 14:46:31.402 syncTest[26054:9467066] 3
2015-05-16 14:46:31.402 syncTest[26054:9467066] 4
2015-05-16 14:46:31.403 syncTest[26054:9467066] next
2015-05-16 14:46:31.421 syncTest[26054:9467066] finish
这里看出任务是头尾相接得,只有dispatch_group_leave之后下一个任务才会进行。

这里需要注意的是我们在dispatchgetmain_queue()主线程的队列里面执行的,不适合运行长时间的任务,一般使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

如果不在乎分组内的任务的顺序,可以使用dispatch_group_async

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t serviceGroup = dispatch_group_create();

// Start the first task
dispatch_group_async(serviceGroup, queue, ^{
    [self startTask:5  Block:^(BOOL success) {

    }];
});

// Start the second task
dispatch_group_async(serviceGroup, queue, ^{
    [self startTask:10  Block:^(BOOL success) {

    }];
});

dispatch_group_notify(serviceGroup,queue,^{
        NSLog(@"finish");
});

NSLog(@"next");

输出结果:

2015-05-16 14:35:26.978 syncTest[25914:9451334] next
2015-05-16 14:35:26.978 syncTest[25914:9451392] 0
2015-05-16 14:35:26.978 syncTest[25914:9451393] 0
2015-05-16 14:35:26.979 syncTest[25914:9451393] 1
2015-05-16 14:35:26.979 syncTest[25914:9451393] 2
2015-05-16 14:35:26.979 syncTest[25914:9451393] 3
2015-05-16 14:35:26.979 syncTest[25914:9451393] 4
2015-05-16 14:35:26.979 syncTest[25914:9451393] 5
2015-05-16 14:35:26.979 syncTest[25914:9451393] 6
2015-05-16 14:35:26.979 syncTest[25914:9451393] 7
2015-05-16 14:35:26.979 syncTest[25914:9451393] 8
2015-05-16 14:35:26.980 syncTest[25914:9451393] 9
2015-05-16 14:35:26.979 syncTest[25914:9451392] 1
2015-05-16 14:35:26.980 syncTest[25914:9451392] 2
2015-05-16 14:35:26.980 syncTest[25914:9451392] 3
2015-05-16 14:35:26.980 syncTest[25914:9451392] 4
2015-05-16 14:35:26.980 syncTest[25914:9451392] finish
这里任务1和任务2的调用虽然是按照队列来的,但是因为是block,所以执行的同时的,而全部完成之后才会调用完成方法,对于整个group来说是异步的,一旦运行之后,next的被调用时间是不确定的。

相关文章

  • GCD--同步执行

    在实际开发中,我们需要按顺序执行一些异步的任务,我们应该怎么做呢? 答案是:dispatch_group_noti...

  • 同步执行

    Promise 与async 请求结束后执行then ()

  • iOS GCD随记(一)任务/队列组合

    1.同步执行+串行队列2.同步执行+并行队列3.异步执行+串行队列4.异步执行+并行队列5.同步执行+主队列6.异...

  • 异步编程

    同步与异步 同步:按代码顺序依次执行 异步:先执行同步代码,完成后再执行异步代码 事件循环与消息队列:当代码执行到...

  • 一、多线程基础

    多线程基础 基本概念 同步、异步 同步 线程B要等待线程A的执行结果之后才能执行。要顺序执行 异步 相对同步来说,...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • GCD小总结

    单例模式 串行队列同步/异步执行任务 并发队列同步/异步执行任务 队列组 延时执行 barrier

  • iOS相关 | GCD学习

    GCD核心概念:任务和队列 任务:在线程中执行的那段代码。执行方式有两种:同步执行和异步执行 * 同步执行:只能在...

  • GCD--补充

    最近总是忙着忙那,好久没动过笔了, dispatch_semaphore_create,dispatch_sema...

  • 多线程

    NSBlockOperation 需手动执行start方法才会执行,同步执行。 NSBlockOperation ...

网友评论

本文标题:GCD--同步执行

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