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
Ios 现在如何知道具有嵌套循环的多个服务器调用方法何时全部完成_Ios_Objective C_Objective C Blocks_Grand Central Dispatch - Fatal编程技术网

Ios 现在如何知道具有嵌套循环的多个服务器调用方法何时全部完成

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

我有多种方法,每个方法都有嵌套循环和facebook请求。有一个X id的数组,每个方法循环遍历每个id,请求该id,然后处理结果数据

我需要在每个方法完成后得到通知。。。也就是说,当该方法完成了对数组中所有id的循环,为每个id发出facebook请求,收到结果并使用结果数据完成任务时。我似乎不知道如何才能做到这一点。以下是这些方法的示例:

- (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&知道服务器呼叫何时完成。。。我认为更多的是了解所有嵌套循环何时完成迭代。但我将对此进行研究,看看是否有某种方法可以为嵌套循环完成设置通知系统???这很有帮助。。。