Ios 我如何知道我在中央调度中心的所有任务都已完成?

Ios 我如何知道我在中央调度中心的所有任务都已完成?,ios,Ios,我需要将多个任务发送到Grand Central Dispatch才能运行。有些任务将首先完成,而有些任务将最后完成 我如何知道我在中央调度中心的所有任务都已完成 我应该使用计数器记录完成的任务数吗?任何更智能的方法?您可以使用调度组在所有任务完成时收到通知。这是我们的一个例子 如果希望控制一个任务在最后执行,可以使用调度组,如果希望一个任务不仅在某些任务之后执行,而且在某些任务之前执行,可以使用调度同步: dispatch_queue_t queue = dispatch_queue_crea

我需要将多个任务发送到Grand Central Dispatch才能运行。有些任务将首先完成,而有些任务将最后完成

我如何知道我在中央调度中心的所有任务都已完成


我应该使用计数器记录完成的任务数吗?任何更智能的方法?

您可以使用调度组在所有任务完成时收到通知。这是我们的一个例子


如果希望控制一个任务在最后执行,可以使用调度组,如果希望一个任务不仅在某些任务之后执行,而且在某些任务之前执行,可以使用调度同步:

dispatch_queue_t queue = dispatch_queue_create("com.example.gcd", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ printf("1");});

dispatch_async(queue, ^{ printf("2");});

dispatch_barrier_sync(queue, ^{ printf("3");});

dispatch_async(queue, ^{ printf("4");});

dispatch_async(queue, ^{ printf("5");});
它可以打印

 12345 or 21354 or ... but 3 always after 1 and 2, and 3 always before 4 and 5
如果要精确控制顺序,可以使用dispatch\u sync或串行调度队列或NSOperationQueue。如果使用NSOperationQueue,请使用“addDependency”方法控制任务的顺序:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"op 1");
}];

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"op 2");
}];

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"op 3");
}];

//op3 is executed last after op2,op2 after op1    
[op2 addDependency:op1];
[op3 addDependency:op2];

[queue addOperation:op1];
[queue addOperation:op2];
[[NSOperationQueue mainQueue] addOperation:op3];
它将始终打印:

op1 op2 op3

您可以使用GCD在swift 3中使用DispatchGroup实现这一点。当所有任务完成时,您会收到通知

 let group = DispatchGroup()

    group.enter()
    run(after: 6) {
      print(" 6 seconds")
      group.leave()
    }

    group.enter()
    run(after: 4) {
      print(" 4 seconds")
      group.leave()
    }

    group.enter()
    run(after: 2) {
      print(" 2 seconds")
      group.leave()
    }

    group.enter()
    run(after: 1) {
      print(" 1 second")
      group.leave()
    }


    group.notify(queue: DispatchQueue.global(qos: .background)) {
      print("All async calls completed")
}

谢谢iOS是否支持此功能?开发指南sais“在iOS 4.0及更高版本中提供。”()
 let group = DispatchGroup()

    group.enter()
    run(after: 6) {
      print(" 6 seconds")
      group.leave()
    }

    group.enter()
    run(after: 4) {
      print(" 4 seconds")
      group.leave()
    }

    group.enter()
    run(after: 2) {
      print(" 2 seconds")
      group.leave()
    }

    group.enter()
    run(after: 1) {
      print(" 1 second")
      group.leave()
    }


    group.notify(queue: DispatchQueue.global(qos: .background)) {
      print("All async calls completed")
}