2014-04-12 28 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

相關問題