Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 中央调度台。如何运行一个异步组,等待,然后运行另一个,再次等待,然后完成?_Objective C_Ios_Grand Central Dispatch - Fatal编程技术网

Objective c 中央调度台。如何运行一个异步组,等待,然后运行另一个,再次等待,然后完成?

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

下面是一个示例函数,我尝试运行一个主组wait,然后在单独的线程上运行另外两个后台任务wait,然后返回在下面显示的常规块中更改的值。下面显示的是我对如何做到这一点的猜测。如果我在一个块中运行所有这些块,它就会工作。当我分开这些块时,它失败了。有没有人举过他们如何完成类似任务的例子?提前感谢你的帮助

-(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);