2014-04-12 29 views
1

我有一个数据模型/存储对象,通过几个包含数据的API与Internet接口。要与之交互的API数量是动态的:从概念角度来看,我们可以将端点视为NSMutableArray中的字符串。问题是我想在最后的端点/ API调用完成之后通知观看者/其他观察者更新的数据。我试过GCD调度,但下面的模式似乎不能正常工作:等待,直到所有的iOS块被执行之前

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_group_t group = dispatch_group_create(); 

dispatch_group_async(group, queue, ^{ 

    for(MyAPIEndpoint __weak __block *ep in apiList) 
    { 

     [self runAPI:ep withCompletionBlock:^(MyAPIEndpoint *api, NSError *err) 
     { 
      // update the data model here, code omitted as it's not relevant 
     } 
     ]; 
    } 
}); 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 

// this statement must only execute AFTER the last block in the for loop above is done 
[[NSNotificationCenter defaultCenter] postNotificationName:@"apiDataUpdated" object:self]; 

但是,它似乎没有工作;看起来这个[self runAPI ...]调用中的代码永远不会执行?

回答

4

我前几天和派遣组一起玩过,这里有一个真正有用的blog post作者jrturton这应该可以帮助你了解基础!

但基本上看起来你错过了进入/离开调度组的行。因此,您的runAPI方法正在运行,因为您没有组中的项目,并且[[NSNotificationCenter defaultCenter] postNotificationName:@"apiDataUpdated" object:self];被直接调用。

dispatch_group_t group = dispatch_group_create(); 

for(MyAPIEndpoint __weak __block *ep in apiList) 
{ 
    dispatch_group_enter(group); 
    [self runAPI:ep withCompletionBlock:^(MyAPIEndpoint *api, NSError *err) 
    { 
     // update the data model here, code omitted as it's not relevant 
     dispatch_group_leave(group); 
    }]; 
} 
}); 

dispatch_group_notify(group, dispatch_get_main_queue(),^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"apiDataUpdated" object:self]; 
}); 
+0

Thanks @Rich,让我试试吧! –

+0

对不起,我混合和匹配的代码,并没有从你的问题中取出一些代码,让我编辑一个完整的实现的答案! – Rich

+0

@UzumakiNaruto完成:) – Rich

相关问题