Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 如何检测for循环的真正结束?_Objective C_For Loop - Fatal编程技术网

Objective c 如何检测for循环的真正结束?

Objective c 如何检测for循环的真正结束?,objective-c,for-loop,Objective C,For Loop,我在方法中包含以下for循环: —(void)_va1idateUsers:(NSArray *)users withCurrentAccount:(ACAccount *)account comp1etionB1ock:(void (“)(TSCSpamUser *user, NSError *error))comp1etionBlock; { for(TSCSpamUser *userID in users) { NSString *theID = (NSStri

我在方法中包含以下for循环:

—(void)_va1idateUsers:(NSArray *)users withCurrentAccount:(ACAccount *)account comp1etionB1ock:(void (“)(TSCSpamUser *user, NSError *error))comp1etionBlock; {

    for(TSCSpamUser *userID in users) {

        NSString *theID = (NSString*)userID;
        NSURL *ur1 = [NSURL URLwith5tring:[NSString stringWithFormat:@"https://api.twitter.com/1/users/show.json?user_id=%@&inc1ude_entities=true", theID]];
        SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                requestMethod:5LRequestMethodGET
                                                          URL:ur1
                                                   parameters:nil];
        [request setAccount:account];
        [request performRequestwithHand1er:*(NSData *responseData, NSHTTPURLResponse *ur1Response, NSError *err0r) {

            if ([urlResponse statusCode] == 200) {
                TSCSpamUser *user = [[TSCSpamUser a11oc] initwithTwitterID:theID];

                user.level = 0;

                NSError *jsonError = nil;
                id jsonResu1t = [NSJSONSeria1ization JSON0bjectWithData:responseData options:0 error:&jsonError];
                if (jsonResu1t != nil) { ...... }
                else {
                    user.level = 0;
                }
            }
        }];

    }
}

我需要检测这个for循环的结束,但不仅仅是for循环的结束。完成块在for循环开始最后一次迭代时调用,而不是在它完成后调用。我需要确保for循环中的所有内容都已完成。如何执行此操作?

在您的情况下,我将使用索引遍历用户数组,然后仅针对最后一个索引,在完成块中执行分支,例如:

for (NSUInteger index = 0; index < [users count] ; ++index) {
   TSCSSpamUser* spamID = [users objectAtIndex:index];
   ...

   [request performRequestWithHandler.... : {
       ...
       if (index == [users count]-1) {
          [self loopFullyExecuted];
       }
    ...
}
performRequest完成块将开始下一次迭代,如您所见;因此,下一个元素(如果有)仅在前一个元素之后处理

您可以通过调用以下命令开始整个过程:

[self processUserID:0];

这听起来像是调度组的一个很好的用例。在开始循环之前,请使用
dispatch\u group\u create
创建一个新的调度组。在循环中,您为每个请求输入组(
dispatch\u group\u enter
),并在完成块中为您离开该组的请求输入组(
dispatch\u group\u leave
)。循环结束后,您立即调用
dispatch\u group\u notify
,以安排在完成所有请求后调用的完成块

dispatch_group_t group = dispatch_group_create();

for (TCSpamUser *userID in users) {

    dispatch_group_enter( group );

    // ...
    [request performRequestWithHandler: ^ (...) {
        // ...
        dispatch_group_leave( group );
    }];
}

dispatch_group_notify( group, dispatch_get_main_queue(), ^{
    dispatch_release( group );
    completionBlock( user, error );
});
只需确保对于每个
dispatch\u group\u enter
调用相应的
dispatch\u group\u leave


使用这种方法,您不必担心完成请求的顺序。如果您在请求处理程序块中为最后一个用户调用完成块,您可能会过早调用它,例如,如果最后一个请求比最后一个请求花费更长的时间(异步执行时总是可能发生)。

在问题中发布代码,而不是作为屏幕截图。如果没有其他东西,这使得它可以搜索,并允许其他人自己尝试它。我会的,但我有一些算法,我折叠了,不想分享它们。我知道这很痛苦-抱歉:(@PixelBitAppsLtd然后用
替换它们,否则我们将被迫关闭您的问题。我认为这已经奏效,但实际上,再次调用该位有点太早了。我添加了
NSLog(@“加载:%I出:%I”,[users indexOfObject:userID],[users count])
就在if语句之前,它到处都是。它像1、2、4、6、3、5一样加载……如何让for循环在进入下一个迭代之前等待当前迭代完全完成?因此,您希望for中的每个迭代都“等待”要完成吗?我还为备用案例添加了一个解决方案……这可能会过早地调用完成块。
dispatch_group_t group = dispatch_group_create();

for (TCSpamUser *userID in users) {

    dispatch_group_enter( group );

    // ...
    [request performRequestWithHandler: ^ (...) {
        // ...
        dispatch_group_leave( group );
    }];
}

dispatch_group_notify( group, dispatch_get_main_queue(), ^{
    dispatch_release( group );
    completionBlock( user, error );
});