Objective c 中央调度台。如何运行一个异步组,等待,然后运行另一个,再次等待,然后完成?
下面是一个示例函数,我尝试运行一个主组wait,然后在单独的线程上运行另外两个后台任务wait,然后返回在下面显示的常规块中更改的值。下面显示的是我对如何做到这一点的猜测。如果我在一个块中运行所有这些块,它就会工作。当我分开这些块时,它失败了。有没有人举过他们如何完成类似任务的例子?提前感谢你的帮助Objective c 中央调度台。如何运行一个异步组,等待,然后运行另一个,再次等待,然后完成?,objective-c,ios,grand-central-dispatch,Objective C,Ios,Grand Central Dispatch,下面是一个示例函数,我尝试运行一个主组wait,然后在单独的线程上运行另外两个后台任务wait,然后返回在下面显示的常规块中更改的值。下面显示的是我对如何做到这一点的猜测。如果我在一个块中运行所有这些块,它就会工作。当我分开这些块时,它失败了。有没有人举过他们如何完成类似任务的例子?提前感谢你的帮助 -(NSString *)sampleFunction:(NSString*)inputString { __block NSString *returnString; dispatch_gr
-(NSString *)sampleFunction:(NSString*)inputString
{
__block NSString *returnString;
dispatch_group_t mainGroup = dispatch_group_create();
dispatch_group_t otherGroup = dispatch_group_create();
void (^firstBlock)(void) = ^(void)
{
...
};
void (^secondBlock)(void) = ^(void)
{
...
};
void (^thirdBlock)(void) = ^(void)
{
...
};
dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock);
dispatch_group_wait(oneGroup, sizeof(int));
dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock);
dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock);
dispatch_group_wait(otherGroup, sizeof(int));
dispatch_release(userGroup);
dispatch_release(otherGroup);
return returnString;
}
dispatch_信号灯是您的朋友。:-)
如果您想要一个更简单的解决方案,只需使用dispatch_apply(它为您提供信号量),而不是使用这些组,尽管不确定您使用组的目的是什么。dispatch_semaphore是您的朋友。:-)
如果您想要一个更简单的解决方案,只需使用dispatch_apply(它为您提供信号量),而不是这些组,尽管不确定您使用组的目的是什么。有很多不同的方法可以做到这一点,但从概念上讲最简单(或至少最明显)的方法是为您的任务的每个阶段创建一个组“管道”,然后让A组的完成回调安排B组的工作,B组也有一个完成回调安排C组的工作
这里的关键不是实际“等待”组完成—这是不必要的。组可以有完成块,当该组中的最后一个块完成时,该块将自动运行(请参见dispatch_group_notify()),这是创建“扇入”的一种好方法“您在小组中展开了大量工作的点。有很多不同的方法可以做到这一点,但从概念上讲最简单(或至少最明显)的方法是为“管道”的每个阶段创建一个小组,然后让A组的完成回调安排B组的工作,B组也有一个完成回调安排C组的工作
这里的关键不是真正地“等待”一个小组完成——这是不必要的。组中可以有完成块,当该组中的最后一个块完成时,该块将自动运行(请参阅dispatch\u group\u notify()),这是创建“扇入”点的一种好方法,在该点上,您已在组中展开了大量工作。请解释全局,您试图完成什么?我没有得到等待部分。为什么要将
sizeof(int)
作为参数传递给dispatch\u group\u wait
?你知道永远调度时间吗?为什么不在一个线程上执行所有代码呢?如果您正在等待线程完成,那么拥有线程还有什么意义呢?我在单独的线程上执行这些事情,因为在UI线程上运行的任务会锁定用户界面。需要先填充第一个块,然后才能运行第二个和第三个块。我暂停最后一次,以便返回从所有块中获得的值。请解释全局,你想实现什么?我没有得到等待部分。为什么要将sizeof(int)
作为参数传递给dispatch\u group\u wait
?你知道永远调度时间吗?为什么不在一个线程上执行所有代码呢?如果您正在等待线程完成,那么拥有线程还有什么意义呢?我在单独的线程上执行这些事情,因为在UI线程上运行的任务会锁定用户界面。需要先填充第一个块,然后才能运行第二个和第三个块。我暂停最后一次,以便返回从所有块获得的值。谢谢您的快速回复。我很快就会尝试这个方法,当我成功的时候,我会给你一个正确的答案:)谢谢你的快速回复。我很快就会尝试这个方法,当我成功的时候,我会给你一个正确的答案:)
/* Create your semaphore with 0 */
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
/* wait on the semaphore, causes your second & third queue to wait */
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
/* At the end of your first queue finishing, signal the semaphore waiting in
the 2nd queue to take over */
dispatch_semaphore_signal(sema);