Ios 现在如何知道具有嵌套循环的多个服务器调用方法何时全部完成
我有多种方法,每个方法都有嵌套循环和facebook请求。有一个X id的数组,每个方法循环遍历每个id,请求该id,然后处理结果数据 我需要在每个方法完成后得到通知。。。也就是说,当该方法完成了对数组中所有id的循环,为每个id发出facebook请求,收到结果并使用结果数据完成任务时。我似乎不知道如何才能做到这一点。以下是这些方法的示例:Ios 现在如何知道具有嵌套循环的多个服务器调用方法何时全部完成,ios,objective-c,objective-c-blocks,grand-central-dispatch,Ios,Objective C,Objective C Blocks,Grand Central Dispatch,我有多种方法,每个方法都有嵌套循环和facebook请求。有一个X id的数组,每个方法循环遍历每个id,请求该id,然后处理结果数据 我需要在每个方法完成后得到通知。。。也就是说,当该方法完成了对数组中所有id的循环,为每个id发出facebook请求,收到结果并使用结果数据完成任务时。我似乎不知道如何才能做到这一点。以下是这些方法的示例: - (void)runLoopForFacebookFriendsContent1 { for (NSString *fbIdStr in se
- (void)runLoopForFacebookFriendsContent1 {
for (NSString *fbIdStr in self.fbIdsArr){
FBRequest *fbRequest = [FBRequest requestWithGraphPath:graphPathString parameters:nil HTTPMethod:@"GET"];
[fbRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
if (error) {
//show alert
} else {
//Do stuff with the resulting data
}
}];
}
}
- (void)runLoopForFacebookFriendsContent2 {
for (NSString *fbIdStr in self.fbIdsArr){
FBRequest *fbRequest2 = [FBRequest requestWithGraphPath:graphPathStringNumber2 parameters:nil HTTPMethod:@"GET"];
[fbRequest2 startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
if (error) {
//show alert
} else {
for (PF_FBGraphObject *obj in [result objectForKey:@"data"]){
NSLog(@"facebook result: %@",result);
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
[dict setValue:@"type2" forKey:@"ContentType"];
[dict setValue:obj forKey:@"data"];
[self.theFacebookDataArray addObject:dict];
}
}
}];
}
}
我在viewwillbeen中调用这些方法。有没有办法设置某种类型的完成处理程序,将这些方法的调用放入其中?然后在所有操作完成后发布NSNotification?一个选项是查看框架。我发现,在你经历了一段学习曲线之后,这种模式非常有帮助 以下是直接来自链接文件的示例:
// Perform 2 network operations and log a message to the console when they are
// both completed.
//
// +merge: takes an array of signals and returns a new RACSignal that passes
// through the values of all of the signals and completes when all of the
// signals complete.
//
// -subscribeCompleted: will execute the block when the signal completes.
[[RACSignal
merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]]
subscribeCompleted:^{
NSLog(@"They're both done!");
}];
您可以很容易地将其应用于Facebook SDK。这种行为是意料之中的,因为您正在调用
dispatch\u group\u enter
,然后立即调用dispatch\u group\u leave
,这意味着该组无需等待
您应该在每个区块前调用dispatch\u group\u enter
,在每个区块结束时调用dispatch\u group\u leave
请在此处检查已接受的答案:
更新:
对于给定的示例,您可以在每次调用startWithCompletionHandler:
之前调用dispatch\u group\u enter
,并在完成块末尾调用dispatch\u group\u leave
:
for (...) {
FBRequest *fbRequest = ...;
dispatch_group_enter(group);
[fbRequest startWithCompletionHandler:^(...) {
...
dispatch_group_leave(group);
}
}
不想回答我自己的问题。。。我真的不喜欢这样做,希望有一个更优雅的解决方案。。。但它似乎没有到来,有人甚至否决了这个问题。所以我将发布我的解决方案并结束这个问题。如果您在阅读本文时遇到了类似的问题,我会通过以下方式解决: 为每个方法创建2个int。一个int立即被设置为遍历的数组的计数。在每次迭代结束时,我都会发布一个通知。在NSNotification处理程序方法中,我将++增加第二个int&每次运行if条件,检查它们是否匹配
当有很多这样的方法发生时,跟踪所有这些是一件痛苦的事情。。。所以,如果有人能找到更好的解决方案,我很乐意听到。感谢所有回答问题并尽力提供帮助的人,我对此表示感谢 但这正是问题所在。。。我不知道在哪里打电话给调度组离开。上面的代码只是为了显示我一直在尝试的想法。。。我试过的不止一件事。我把派遣组放在我能想到的任何地方,但没有成功。如果我只是把它作为每个方法的最后一行,那么它不起作用&在服务器调用完成之前会发生notify。我不能把它放在服务器调用的完成块中,因为服务器调用是通过不同的id在一个循环中进行的,所以组离开在第一次迭代时会发生碰撞。根据上面的代码,我可以在哪里或如何放置调度组离开,以便在整个方法完成后让它离开?在每个嵌套循环的每次迭代之后是什么意思?是否可以将对方法的调用(从ViewDidDisplay)放在块内?类似于“blah_blah_completion(block^{[self-runLoopMethod1];})”之类的东西???我添加了更多的细节,再次检查答案。我明白你的意思,我已经玩弄过了,但我似乎无法让它做我需要做的事情。我需要知道或者在整个方法完成时得到通知。。。即,当整个嵌套for循环系列完成时。我会尽量把问题更新得更短更清楚谢谢你的回答,我会查出来的。问题不在于facebook&知道服务器呼叫何时完成。。。我认为更多的是了解所有嵌套循环何时完成迭代。但我将对此进行研究,看看是否有某种方法可以为嵌套循环完成设置通知系统???这很有帮助。。。