gpt4 book ai didi

objective-c - 使用 GCD 等待条件

转载 作者:行者123 更新时间:2023-12-03 17:05:32 25 4
gpt4 key购买 nike

我正在尝试使用 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 });

由于我的应用程序的性质,需要等待的任务可能会在我需要等待的工作之前发生。我真正想要的是能够以这种方式等待条件,当条件完成时,它就完成了,并且所有 future 的线程都可以做他们的事情。 GCD有这个吗?

最佳答案

我不确定您实现的所有细节,所以如果我重复您已经知道的内容,请原谅我。

  1. 创建调度组
  2. 使用dispatch_group_async到串行队列。使用串行队列,您可以确保您的任务按照您希望的顺序进行处理。如果顺序并不重要,但您的问题表明它们必须按特定顺序完成,请使用并发队列。
  3. 分派(dispatch)完所有任务后,请使用dispatch_group_notify。一旦分配给该组的所有任务完成处理,这将在您指定的队列上执行一个 block 。

    dispatch_group_notify(startup, dispatch_get_main_queue(), ^{
    // Don't forget to release the dispatch group!
    dispatch_release(startup)
    // perform work block;
    });

对于特定的解析事件,我需要对数据进行一些处理,这些处理可以在其余解析事件正在进行时完成。我将处理分配给并发队列上的一个组。然后,当我的解析完成时,我检查该组是否完成。如果完成了,我会把东西清理干净。如果没有,请使用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];
});
}

祝你好运!

关于objective-c - 使用 GCD 等待条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9422105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com