使用GCD等待条件

时间:2012-02-23 22:04:47

标签: objective-c multithreading cocoa grand-central-dispatch

我正在尝试使用Grand Central Dispatch强制执行特定的任务订单,但我在理解正确的方法时遇到了一些麻烦。我尝试以下列方式使用组:

初​​始化:

startup = dispatch_group_create();

需要等待的任务:

//Don't want to wait on the main thread, so dispatch async to a concurrent queue
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0L),^{
        //Wait until we're finished starting up
        dispatch_group_wait(startup,DISPATCH_TIME_FOREVER);
        //Now we can do this stuff back on the main queue
        dispatch_async(dispatch_get_main_queue(),^{
            //Do work
        });
    });

我需要等待的工作:

dispatch_group_async(startup,dispatch_get_main_queue(),^{ // work });

由于我的应用程序的性质,需要等待的任务可以在我需要等待的工作之前进行。我真正想要的是能够在条件完成,条件完成以及所有未来线程都可以完成任务的情况下等待。 GCD有这个吗?

2 个答案:

答案 0 :(得分:2)

我不确定你实施的所有细节,如果我重复你已经知道的事情,请原谅我。

  1. 创建调度组
  2. 将dispatch_group_async用于串行队列。使用串行队列,您可以确保按照您希望的顺序处理任务。如果您的订单无关紧要,请使用并发队列,但您的问题是他们必须按特定顺序完成。
  3. 完成所有任务的调度后,请使用dispatch_group_notify。一旦分配给该组的所有任务都已完成处理,这将在您指定的队列上执行一个块。

    dispatch_group_notify(startup, dispatch_get_main_queue(), ^{
          // Don't forget to release the dispatch group!
          dispatch_release(startup)
         // perform work block;
    });
    
  4. 对于特定的解析活动,我需要对其他解析活动正在进行时可以完成的数据进行一些处理。我将处理分配给并发队列上的组。然后,当我的解析完成后,我会检查该组是否完成。如果完成了,我会把事情搞清楚。如果没有,请使用dispatch_group_notify()并在之后执行工作。这些方面的东西:

    double delayInSeconds = 2.0;
    dispatch_time_t groupWaitTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    if (dispatch_group_wait(myDispatchGroup, groupWaitTime)==0){
        NSLog(@"dispatch group completed in time");
        dispatch_release(myDispatchGroup);
        [self parsingCompleteWithActivity:activity];
    }else{
        NSLog(@"dispatch group did not complete in time");
        dispatch_group_notify(myDispatchGroup, dispatch_get_main_queue(), ^{
                dispatch_release(myDispatchGroup);
                [self parsingCompleteWithActivity:activity];
        });
    }
    
    祝你好运!

答案 1 :(得分:0)

如果我使用信号量然后在每次等待呼叫后发出信号,则工作。 如果我调用dispatch_group_enter和dispatch_group_leave也可以。